【问题标题】:Avoiding MemoryError when iterating over generator迭代生成器时避免 MemoryError
【发布时间】:2020-10-25 13:16:26
【问题描述】:
我有一个大文件,直接读取到内存正在提高MemoryError。我通过将它读到生成器来克服它
def rea():
with open('D:\\random.forge', 'rb') as f:
yield f.read()
当我想使用for loop 从rea() 迭代创建的生成器时,我总是有MemoryError。我想出使用del 关键字删除迭代值,但似乎当您使用for loop 迭代生成器时,它会将整个生成器保存到内存中。在这种特定情况下,我可以以某种方式迭代生成器吗?文件大小为几 GB。
【问题讨论】:
标签:
python
loops
generator
【解决方案1】:
调用 f.read() 在您创建的生成器的第一次迭代时将整个文件加载到内存中。
尝试让行,而不是整个内容:
def rea():
with open('D:\\random.forge', 'rb') as f:
for line in f:
yield line
【解决方案2】:
.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)
【解决方案3】:
f.read() 可以带一个参数来表示块大小,即你要在一次迭代中读取的文件的大小。例如,如果您想一次读取 1 kb,则可以将块大小设置为 1024。
def rea(chunk_size=1024):
with open('D:\\random.forge', 'rb') as f:
data = f.read(chunk_size)
yield data