我有一个大文件,直接读取内存会引发MemoryError
。我通过向生成器读取它来克服这一点
def rea():
with open('D:\random.forge', 'rb') as f:
yield f.read()
当我想使用for loop
从rea()
迭代创建的生成器时,我总是有MemoryError
。我提出使用del
关键字删除迭代值,但似乎当您使用for loop
迭代生成器时,它会将整个生成器保存到内存中。在这种特定的情况下,我能以某种方式迭代生成器吗?该文件的大小为几GB。
方法.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()
会将整个文件加载到内存中。
尝试让步行,而不是整个内容:
def rea():
with open('D:\random.forge', 'rb') as f:
for line in f:
yield line
f.read()
可以取一个块大小参数,它是要在一次迭代中读取的文件的大小。例如,如果您想一次读取1kb,可以将块大小设置为1024。
def rea(chunk_size=1024):
with open('D:\random.forge', 'rb') as f:
data = f.read(chunk_size)
yield data