2015-07-06 30 views
3

我需要加载约100k文件与载体和聚合内容在一个numpy数组。这个过程大约需要3分钟,所以我想加快速度。我试图用gevent来加速它,但我无法获得任何加速。没有加速读取文件与gevent

我读到应该使用异步调用来加速IO调用而不是多处理。我进一步阅读gevent是推荐的图书馆。我写了一个例子来下载图片,我可以看到速度的巨大提高。这里是我的代码

def chunks(l, n): 
    """ Yield successive n-sized chunks from l. 
    """ 
    for i in xrange(0, len(l), n): 
     yield l[i:i+n] 

file_paths = # list of filenames 
numpy_array = numpy.ones([len(file_paths), file_size]) 
pool = gevent.pool.Pool(poolsize) 
for i, list_file_path_tuples in enumerate(chunks(file_paths, CHUNK_SIZE)): 
    gevent_results = pool.map(numpy.load, list_file_path_tuples) 
    pool.join() 
    for i_chunk, result in enumerate(gevent_results): 
     index = i * CHUNK_SIZE + i_chunk 
     data = result['arr_0'] 
     numpy_array[index] = data 

使用块是必要的简化版本,否则我会所有的载体两次在内存中。

在我的代码中存在问题还是使用错误的方法?

回答

4

你是否分析了你的代码,并且知道热点在哪里?如果不是计算,那可能只是磁盘IO。我怀疑你会因IO逻辑技巧而获得性能提升。最后,顺序磁盘访问可能是限制。如果你有一个RAID系统,从磁盘读取多个线程可能是有意义的,但你可以用python标准线程来完成。尝试从1增加到几个,并沿途测量以找到最佳点。

您看到gevent下载图像并行改进的原因是,网络IO吞吐量可以通过多个连接改善很多。当远程服务器没有直接连接到网络设备时,单个网络连接几乎不能使网络带宽饱和。而单个磁盘IO操作可以轻松饱和磁盘吞吐量。