我想知道按顺序读取文件与并行读取文件之间的权衡。
假设我有一个百兆字节大小的文件,我想要处理,但没有足够的内存来同时保存所有这些文件。为了按顺序处理这些,我可以这样做:
results = [do_something(os.path.join(files, f)) for f in os.listdir(files)]
或者我可以并行完成:
paths = [os.path.join(files, f) for f in os.listdir(files)]
p = multiprocessing.Pool()
try:
results = p.map(do_something, paths)
p.close()
p.join()
except KeyboardInterrupt:
p.terminate()
总的来说,我被警告不要执行并行I / O,因为随机磁盘读取速度很慢。但在这种情况下是平行的方式去?或者也许是一些混合策略?
另外,我注意到并行版本保留了目录的结构;也就是说,输出的顺序正确。这是否意味着它实际上是顺序执行,还是python只是善良? 编辑: Blender清除了第二个问题。谢谢,Blender!
感谢您的帮助。
答案 0 :(得分:2)
这在一定程度上取决于他们所使用的存储介质的类型。由于搜索活动,传统的硬盘驱动器将几乎停止爬行。 SSD,OTOH不易受随机读取的影响(尽管它并不完全不受影响)。
即使你有一个SSD,你可能会发现有一个收益递减的点,虽然默认的池大小可能很好,你甚至可能发现甜点远远高于cpu_count()
。进行任何预测的因素太多,因此您应该尝试不同的池大小。
答案 1 :(得分:2)
如果每个文件有多个磁盘访问,则磁盘IO会损害并行处理。但是,如果在do_something
中进行的处理足够少,则可能不值得在线程池中进行上下文切换所需的处理。既然你说do_something
非常昂贵,那么它可能值得并行处理。
此外,如果您只是将文件完全读入内存一次,而不是逐行读取文件,则可以最小化磁盘IO。当然这需要更多内存,但它可能会显着缩短处理时间。