使用 gevent 无法加速文件读取速度

3

我需要加载大约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

使用块是必要的,否则我会在内存中有两份相同的向量。
我的代码有问题吗?还是我使用了错误的方法?
1个回答

4
你是否对代码进行了分析,并且知道热点在哪里?如果不是计算问题,那么很可能只是磁盘IO的问题。我怀疑通过IO逻辑的技巧可以提高性能。最终,可能会受到顺序磁盘访问的限制。如果你有一个RAID系统,可能需要多个线程从磁盘中读取,但你可以使用Python标准线程来实现。尝试从1个线程逐步增加到几个线程,同时测量以找到最佳性能点。
你之所以看到使用gevent并行下载图像时有所改善,是因为通过多个连接可以大大提高网络IO吞吐量。当远程服务器没有直接连接到你的网络设备时,单个网络连接几乎无法饱和网络带宽。而单个磁盘IO操作很容易饱和磁盘吞吐量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接