Python 在生成器上迭代时避免内存错误
我有一个大文件,直接读取内存会引起Python 在生成器上迭代时避免内存错误,python,loops,generator,Python,Loops,Generator,我有一个大文件,直接读取内存会引起MemoryError。我通过读给发电机来克服这个问题 def rea(): with open('D:\\random.forge', 'rb') as f: yield f.read() 当我想从rea()使用for循环迭代创建的生成器时,我总是有MemoryError。我使用del关键字来删除迭代值,但当您使用for loop对生成器进行迭代时,似乎会将整个生成器保存到内存中。在这种特定情况下,我是否可以迭代生成器?文件大小为几G
MemoryError
。我通过读给发电机来克服这个问题
def rea():
with open('D:\\random.forge', 'rb') as f:
yield f.read()
当我想从rea()
使用for循环迭代创建的生成器时,我总是有MemoryError
。我使用del
关键字来删除迭代值,但当您使用for loop
对生成器进行迭代时,似乎会将整个生成器保存到内存中。在这种特定情况下,我是否可以迭代生成器?文件大小为几GB。调用f.read()
在创建的生成器上进行第一次迭代时,将整个文件加载到内存中
尝试使用线条,而不是整个内容:
def rea():
with open('D:\\random.forge', 'rb') as f:
for line in f:
yield line
方法.read()
读取整个文件,以便将其加载到内存中
你可以循序渐进地阅读
对于文本文件,您可以按行读取:
def read():
with open('D:\\random.forge', 'r') as f:
return f
for line in read():
print(line)
对于二进制文件,可以按字节批读取:
def read():
CHUNKSIZE = 1024 # for example
with open('D:\\random.forge', 'rb') as f:
bytes_read = f.read(CHUNKSIZE)
while bytes_read:
yield bytes_read
bytes_read = f.read(CHUNKSIZE)
for bytes_batch in read():
do_stuff(bytes_batch)
f.read()
可以为chunk size获取一个参数,该参数是您希望在一次迭代中读取的文件的大小。例如,如果希望一次读取1KB,可以将块大小设置为1024
def rea(chunk_size=1024):
with open('D:\\random.forge', 'rb') as f:
data = f.read(chunk_size)
yield data
你想对这些内容做什么?