没有使用 gevent 加速读取文件
No speedup reading files with gevent
我需要加载约 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
使用块是必要的,否则我会在内存中有两次所有向量。
我的代码有问题还是我使用了错误的方法?
您是否分析过您的代码并知道热点在哪里?如果不是计算,它可能只是磁盘 IO。我怀疑你会通过 IO 逻辑技巧来提高性能。最后,顺序磁盘访问可能是限制。如果你有一个 RAID 系统,那么从磁盘读取多个线程可能是有意义的,但你可以使用 python 个标准线程来做到这一点。尝试从 1 增加到几个,并一路测量以找到最佳点。
您看到 gevent 并行下载图像有所改进的原因是网络 IO 吞吐量可以通过多个连接得到很大提高。当远程服务器未直接连接到您的网络设备时,单个网络连接很难使网络带宽饱和。而单个磁盘 IO 操作很容易使磁盘吞吐量饱和。
我需要加载约 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
使用块是必要的,否则我会在内存中有两次所有向量。
我的代码有问题还是我使用了错误的方法?
您是否分析过您的代码并知道热点在哪里?如果不是计算,它可能只是磁盘 IO。我怀疑你会通过 IO 逻辑技巧来提高性能。最后,顺序磁盘访问可能是限制。如果你有一个 RAID 系统,那么从磁盘读取多个线程可能是有意义的,但你可以使用 python 个标准线程来做到这一点。尝试从 1 增加到几个,并一路测量以找到最佳点。
您看到 gevent 并行下载图像有所改进的原因是网络 IO 吞吐量可以通过多个连接得到很大提高。当远程服务器未直接连接到您的网络设备时,单个网络连接很难使网络带宽饱和。而单个磁盘 IO 操作很容易使磁盘吞吐量饱和。