Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在生成器上迭代时避免内存错误_Python_Loops_Generator - Fatal编程技术网

Python 在生成器上迭代时避免内存错误

Python 在生成器上迭代时避免内存错误,python,loops,generator,Python,Loops,Generator,我有一个大文件,直接读取内存会引起MemoryError。我通过读给发电机来克服这个问题 def rea(): with open('D:\\random.forge', 'rb') as f: yield f.read() 当我想从rea()使用for循环迭代创建的生成器时,我总是有MemoryError。我使用del关键字来删除迭代值,但当您使用for loop对生成器进行迭代时,似乎会将整个生成器保存到内存中。在这种特定情况下,我是否可以迭代生成器?文件大小为几G

我有一个大文件,直接读取内存会引起
MemoryError
。我通过读给发电机来克服这个问题

def rea():
    with open('D:\\random.forge', 'rb') as f:
        yield f.read()
当我想从
rea()
使用
for循环迭代创建的生成器时,我总是有
MemoryError
。我使用
del
关键字来删除迭代值,但当您使用
for loop
对生成器进行迭代时,似乎会将整个生成器保存到内存中。在这种特定情况下,我是否可以迭代生成器?文件大小为几GB。

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

尝试使用线条,而不是整个内容:

def rea():
    with open('D:\\random.forge', 'rb') as f:
        for line in f:
            yield line
方法
.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()
    可以为chunk size获取一个参数,该参数是您希望在一次迭代中读取的文件的大小。例如,如果希望一次读取1KB,可以将块大小设置为1024

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

    你想对这些内容做什么?