使用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
相关产品推荐
相关产品推荐

