3

我的问题很简单:我有一个 400MB 的文件,里面有 10,000,000 行数据。我需要遍历每一行,做一些事情,然后从内存中删除该行以避免填充过多的 RAM。

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

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

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

4 回答 4

4

您的提议for line in open('/data/workfile', 'r'):将使用生成器,因此不会将整个文件读入内存。我会继续这样做,直到它实际上太慢了。

于 2010-03-05T16:52:04.233 回答
2

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

于 2010-03-05T16:51:28.953 回答
1

可能在盲目优化之前更好地分析您现有的代码并查看瓶颈的真正位置。

即使处理确实受 I/O 限制,向程序添加几个线程也可能会有所帮助。

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

于 2011-04-16T08:09:22.037 回答
0

您要使用的数据结构是一个队列(它具有适当的阻塞机制,例如并发写入),可在 Multiprocessing 模块中使用。

如果您在数据处理之间没有依赖关系,您可以将逐行生成器映射到具有该模块中的函数的进程池,以便在几行中启用多核。

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

于 2010-03-05T17:34:01.943 回答