You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python流式读取大文件时如何限制内存开销,避免触发MemoryError

Python大文件分块读取内存溢出问题修复方案

现有代码的核心问题

你的代码存在三处明显的逻辑错误,是导致运行异常、内存无法正常释放的核心原因:

  • 误用with上下文管理器:with open()语法会在代码块结束时自动关闭文件,你在循环内部直接调用in_file.close()并删除in_file对象,第一次循环结束后文件对象就已失效,第二次循环的seek、read操作完全无法正常执行
  • 冗余的偏移量计算:文件对象的read方法调用后会自动向后移动偏移指针,完全不需要手动维护current变量、调用seek指定位置,手动计算偏移反而容易出现读取错误
  • 多余的垃圾回收操作:Python采用引用计数为主的内存回收机制,只要块数据没有被其他全局容器持有,循环进入下一轮、变量被重新赋值时旧的块数据会被自动回收,手动调用gc.collect()只会增加不必要的性能开销,对释放内存没有额外帮助

正确的分块读取实现

以下实现可以支持按256M~512M的大小分块读取,处理完的块会自动被内存回收,不需要额外的垃圾回收操作:

# 定义分块大小,256M对应数值为256 * 1024 * 1024,需要调整为512M直接修改数值即可
CHUNK_SIZE = 256 * 1024 * 1024
file_path = "替换为你的实际文件路径"

# 读取二进制文件(压缩包、多媒体、非纯文本文件)用rb模式,纯文本文件可以用r模式
with open(file_path, 'rb') as f:
    while True:
        # 读取指定大小的块,自动处理偏移量
        current_chunk = f.read(CHUNK_SIZE)
        # 块为空时代表文件已经读取完毕,退出循环
        if not current_chunk:
            break
        # 此处编写当前块的处理逻辑
        process_chunk(current_chunk)

注意事项

如果按上述实现仍然出现MemoryError,请排查以下常见问题:

  • 块处理逻辑中是否把当前块的内容存入了全局作用域的列表、字典等可变容器中,只要存在有效引用,块内存就不会被回收
  • 处理文本文件时如果按行处理更符合业务需求,可以直接迭代文件对象:for line in f:,每行处理完成后会自动回收内存
  • 确实需要手动触发释放时,仅需要在块处理完成后添加del current_chunk即可,不需要调用gc.collect(),只有存在循环引用场景时才需要gc介入回收

内容的提问来源于stack exchange,提问作者Matt Klaver

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 13:36:04