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

使用openpyxl分批写入Excel大数据时内存占用过高的问题

问题分析与解决方案

原代码的核心问题

  • 触发时机错误:i % 50000 == 0会在循环刚开始(i=0)就执行保存逻辑,此时还没写入任何有效数据,属于无效操作。
  • 内存越用越多的关键原因:openpyxl默认的Workbook是读写兼容模式,每次调用load_workbook都会把整个Excel文件的所有数据加载到内存里。你每写完一批就重新加载,等于内存里始终存着已写入的全部数据,完全达不到释放内存的目的。
  • 对象清理无效:就算把sheet和book设为None,Python垃圾回收不会立刻释放内存,而且重新加载的文件又把所有数据读回来了,等于做了无用功。

正确的低内存分批写入实现

直接用openpyxl的只写模式(WriteOnlyWorkbook),它就是专门为大量数据写入设计的——数据会直接写入磁盘,不会在内存里堆积,内存占用全程维持在很低的水平。

代码示例:

import openpyxl

# 创建只写模式的工作簿
wb = openpyxl.Workbook(write_only=True)
ws = wb.create_sheet(title="Results")

batch_size = 50000
total_rows = 500000

for i in range(total_rows):
    # 替换成你的实时数据生成逻辑
    row = [f"第{i+1}行数据列1", f"第{i+1}行数据列2"]
    
    ws.append(row)
    
    # 每写完一批手动刷盘(可选,只写模式会自动处理,但手动刷盘更可控)
    if (i + 1) % batch_size == 0:
        wb.save('my_file.xlsx')
        print(f"已完成第{(i+1)//batch_size}批数据写入")

# 最后一批可能不足batch_size,必须执行最终保存
wb.save('my_file.xlsx')
print("所有数据写入完成")

额外说明

  • 只写模式不支持读取操作,刚好匹配你“只生成数据、只写入”的场景,不需要读写切换。
  • 不需要反复加载文件,每一行数据append后会逐步写入磁盘,内存里不会留存历史数据。
  • 如果想进一步优化内存,可以在每批次写入后调用import gc; gc.collect()手动触发垃圾回收,但通常只写模式本身的内存控制已经足够好用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 10:40:29