5

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

假设我想要处理一百万兆字节大小的文件,但没有足够的内存一次容纳所有这些文件。要按顺序处理这些,我可以这样做:

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 只是善良?编辑:搅拌机清除了第二个问题。谢谢,搅拌机!

谢谢您的帮助。

4

2 回答 2

2

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

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

于 2013-06-06T21:33:29.143 回答
2

这部分取决于它们所使用的存储介质的类型。由于寻道活动,传统硬盘驱动器将几乎停止爬行。SSD OTOH 不太容易受到随机读取的影响(尽管它并非完全不受影响)。

即使您有 SSD,您也可能会发现收益递减点,尽管默认池大小可能很好,您甚至可能会发现最佳点远高于cpu_count(). 有太多因素无法做出任何预测,因此您应该尝试不同的池大小。

于 2013-06-06T21:18:05.663 回答