在Python中分割大型文件以进行多处理的最佳方式是什么?

我遇到了许多“尴尬的并行”项目,我想和多处理器模块进行并行化.然而,他们经常涉及阅读大文件(大于2gb),逐行处理,运行基本计算,然后编写结果.使用Python的多处理模块拆分文件并处理它的最佳方式是什么?应该使用多处理中的Queue或JoinableQueue吗?还是队列模块本身?或者,应该使用多处理方法将文件迭代到一个进程池上吗?我已经尝试了这些方法,但开销是巨大的,在一行一行地分发数据.我已经通过使用cat文件|解决了轻便的管道过滤器设计process1 –out-file out1 –num-processes 2 | process2 –out-file out2,它将第一个进程的输入的一定百分比直接传递给第二个输入(见this post),但是我想要一个完全包含在Python中的解决方案.

令人惊讶的是,Python文档并不建议使用规范的方法(尽管多处理文档中有关编程指南的冗长部分).

谢谢,
文斯

附加信息:每行处理时间各不相同.一些问题很快,几乎没有I / O绑定,有些是CPU限制的. CPU绑定的非依赖任务将从并行化获得后台,使得甚至将处理功能分配数据的低效方式在挂钟时间方面仍将是有益的.

一个主要的例子是从行中提取字段的脚本,检查各种按位标记,并以全新的格式将具有某些标志的行写入新文件.这似乎是一个I / O绑定的问题,但是当我用管道的便宜并发版本来运行它时,速度大约快20%.当我使用池和地图运行它,或者在多处理中排队时,总是慢100%.

最佳答案
最好的架构之一是Linux操作系统的一部分.不需要特殊的库.

你想要一个“扇出”的设计.

>“主”程序创建多个通过管道连接的子进程.
>主程序读取文件,将线条写入管道,进行最小过滤,以将行处理到适当的子进程.

每个子进程应该是一个从stdin读取和写入的不同进程的流水线.

您不需要队列数据结构,这正是内存中的管道 – 两个并发进程之间的字节队列.

转载注明原文:在Python中分割大型文件以进行多处理的最佳方式是什么? - 代码日志