我需要加载大约100k个包含向量的文件,并将内容聚合到一个numpy数组中。这个过程需要大约3分钟,所以我想加快速度。我尝试使用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
使用块是必要的,否则我会在内存中有两份相同的向量。
我的代码有问题吗?还是我使用了错误的方法?