Python:使用os.fork更好的文件I / 0?

时间:2010-03-05 16:49:08

标签: python file-io multiprocessing shared-memory

我的问题非常简单:我有一个400MB的文件,里面装满了10,000,000行数据。我需要迭代每一行,做一些事情,并从内存中删除该行以避免填充太多RAM。

由于我的机器有多个处理器,我最初的想法是优化这个过程是为了创建两个不同的过程。人们可以一次读取几行文件并逐渐填充一个列表(列表中的一个元素是文件中的一行)。另一个可以访问这个相同的列表,并弹出()元素并处理它们。这将有效地创建一个从一侧增长而从另一侧缩小的列表。

换句话说,这个机制应该实现一个缓冲区,该缓冲区将不断填充第二个进程的行。但也许这并不比使用更快:

for line in open('/data/workfile', 'r'):

4 个答案:

答案 0 :(得分:4)

您建议的for line in open('/data/workfile', 'r'):将使用生成器,因此整个文件不会被读入内存。我会跟着它,直到它实际上变得太慢。

答案 1 :(得分:2)

您可能受到磁盘速度的限制。 Python已经进行了缓冲,因此逐行读取是有效的。

答案 2 :(得分:1)

可能在进行盲目优化之前,最好先对现有代码进行分析,然后查看瓶颈的确实位置。

即使处理确实是I / O绑定,向程序添加几个线程也可能有所帮助。

这将允许另一个线程等待IO,而另一个线程正在处理先前读取的数据。

答案 3 :(得分:0)

您要使用的数据结构是队列(它具有适用于并发写入的阻塞机制),可在多处理模块中使用。

如果您在处理数据之间没有依赖关系,则可以逐行生成MAP到具有该模块中的函数的进程池,以多行启用整个事物。

另请参阅mapReduce方法(但可能有点矫枉过正)