在生成器上迭代时避免MemoryError

时间:2020-10-25 13:16:26

标签: python loops generator

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

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

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

3 个答案:

答案 0 :(得分:0)

在创建的生成器上进行第一次迭代时,调用f.read()将整个文件加载到内存中。

尝试屈服行,而不是全部内容:

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

答案 1 :(得分:0)

方法 public E remove(int ind) { current = first.findNode(ind); if (first == null) return current.element; if (first == current) { first = current.next; size--; return current.element; } while (first.next != null) { if (first.next == current) { first.next = first.next.next; return current.element; } first = first.next; } size--; return current.element; } 读取整个文件,以便将其加载到内存中。


您可以逐步阅读它。

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

    .read()
  2. 对于二进制文件,可以按批读取:

    def read():
        with open('D:\\random.forge', 'r') as f:
            return f
    
    for line in read():
        print(line)
    

答案 2 :(得分:-1)

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