Python生成器在大文件读取中的内存优势?
我在想,使用Python生成器在这种情况下有没有什么内存上的好处。如果有的话,我想读取一个很大的文本文件,这个文件需要在所有对象之间共享。因为这个文件只需要用一次,程序在读取完这个列表后就结束,所以我打算使用生成器。
我认为生成器的“保存状态”功能可以让它跟踪下一个要传递给调用它的对象的值。我听说生成器还可以节省内存,因为它不是一次性返回所有值,而是按需计算这些值。不过,我有点困惑,不知道在这种情况下我是否能得到什么好处。
示例代码:
def bufferedFetch():
while True:
buffer = open("bigfile.txt","r").read().split('\n')
for i in buffer:
yield i
考虑到缓冲区会读取整个“bigfile.txt”,那么这个文件不就会存储在生成器里吗?这样的话就没有内存上的好处了吧?有没有更好的方法来返回一个可以在所有对象之间共享的列表的下一个值呢?
谢谢。
1 个回答
5
在这种情况下,答案是否定的。你通过使用 .read()
方法把整个文件都读进了内存。
你理想的做法应该是:
def bufferedFetch():
with open("bigfile.txt","r") as f:
for line in f:
yield line
Python 的 file
对象会自动处理行结束符(这跟你的系统有关),而且它内置的迭代器可以让你一行一行地读取文件内容(这样就不会把整个文件都读进内存了)。