【问题标题】: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 looprea() 迭代创建的生成器时,我总是有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() 方法读取整个文件,然后将其加载到内存中。


    您可以逐步阅读。

    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)
      

    【讨论】:

      【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-16
        • 2016-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多