顺序或并行:在python中读取多个文件的正确方法是什么?

时间:2013-06-06 18:30:15

标签: python file-io io multiprocessing

我想知道按顺序读取文件与并行读取文件之间的权衡。

假设我有一个百兆字节大小的文件,我想要处理,但没有足够的内存来同时保存所有这些文件。为了按顺序处理这些,我可以这样做:

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!

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

这在一定程度上取决于他们所使用的存储介质的类型。由于搜索活动,传统的硬盘驱动器将几乎停止爬行。 SSD,OTOH不易受随机读取的影响(尽管它并不完全不受影响)。

即使你有一个SSD,你可能会发现有一个收益递减的点,虽然默认的池大小可能很好,你甚至可能发现甜点远远高于cpu_count()。进行任何预测的因素太多,因此您应该尝试不同的池大小。

答案 1 :(得分:2)

如果每个文件有多个磁盘访问,则磁盘IO会损害并行处理。但是,如果在do_something中进行的处理足够少,则可能不值得在线程池中进行上下文切换所需的处理。既然你说do_something非常昂贵,那么它可能值得并行处理。

此外,如果您只是将文件完全读入内存一次,而不是逐行读取文件,则可以最小化磁盘IO。当然这需要更多内存,但它可能会显着缩短处理时间。