以下是故事:
我有一个765GB的文本文件,必须进行解析。下面,我已经包含了相关的代码:
def ingest(filename):
with open(filename, 'rb') as food:
for line in food:
yield line
处理完大约56GB后,我得到一个KILLED
语句,表明进程内存不足。快速STRACE
表示模块在运行上面显示的函数时死亡。它还显示正在读取的每一行。
这就是我的困惑。一方面,for
循环想要遍历其所有元素。另一方面,yield
语句应强制对iterable进行惰性求值,并在调用next()/__next__
时生成每个元素。或者我想。
在这种情况下,为什么函数会尝试一次读取所有行;而不是一个一个地阅读?
我该如何解决这个特殊问题?