在生成器上迭代时避免MemoryError



我有一个大文件,直接读取内存会引发MemoryError。我通过向生成器读取它来克服这一点

def rea():
    with open('D:\random.forge', 'rb') as f:
        yield f.read()

当我想使用for looprea()迭代创建的生成器时,我总是有MemoryError。我提出使用del关键字删除迭代值,但似乎当您使用for loop迭代生成器时,它会将整个生成器保存到内存中。在这种特定的情况下,我能以某种方式迭代生成器吗?该文件的大小为几GB。

方法.read()读取整个文件,以便将其加载到内存中。


您可以逐步阅读。

  1. 对于文本文件,您可以逐行读取:

    def read():
        with open('D:\random.forge', 'r') as f:
            return f
    for line in read():
        print(line)
    
  2. 对于二进制文件,可以按字节批读取:

    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

最新更新