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

使用Pandas写入DataFrame至Excel时内存占用过高问题咨询

问题分析与解决方案

这是xlsxwriter引擎的设计特性,并非你的使用方式有误。

为什么内存占用高?

xlsxwriter的工作机制是在内存中完整构建整个Excel文件的OOXML结构(包括所有单元格数据、格式元信息、工作表结构等),直到关闭ExcelWriter上下文时,才会把整个内存中的结构序列化写入输出流(这里是BytesIO)。哪怕原始数据只有13000行,Excel内部的元数据、格式存储会额外占用大量内存,最终导致内存飙升至1.1GB。

分块写入无效的原因

分块写入只是把DataFrame拆分成多批写入同一个工作表,但xlsxwriter仍会将所有批次的数据都保留在内存中,最终整合为完整的文件结构,所以总内存占用和一次性写入没有区别。

可行的解决方案

1. 切换到openpyxl引擎

如果不需要xlsxwriter的独有功能(比如复杂图表、条件格式、VBA支持等),openpyxl引擎支持增量写入,内存效率更高。示例代码:

from io import BytesIO
import pandas as pd

file_data = BytesIO()
with pd.ExcelWriter(file_data, engine='openpyxl', mode='w') as writer:
    df.to_excel(writer, sheet_name="data", index=False)
# 写完后重置BytesIO指针到开头,方便后续读取
file_data.seek(0)

2. 先写入临时文件再读入BytesIO(保留xlsxwriter功能)

如果必须使用xlsxwriter,可以先将文件写入本地临时文件,再把文件内容读入BytesIO,这样xlsxwriter会把中间结构写入磁盘,而非全部占用内存:

from io import BytesIO
import pandas as pd
import tempfile
import os

# 假设df是你的目标DataFrame
with tempfile.NamedTemporaryFile(delete=False) as tmp_file:
    tmp_path = tmp_file.name

# 写入临时文件
with pd.ExcelWriter(tmp_path, engine='xlsxwriter', engine_kwargs={"options": {"strings_to_formulas": False}}) as writer:
    df.to_excel(writer, sheet_name="data", index=False)

# 将临时文件内容读入BytesIO
file_data = BytesIO()
with open(tmp_path, 'rb') as f:
    file_data.write(f.read())
file_data.seek(0)

# 清理临时文件
os.unlink(tmp_path)

3. 优化DataFrame的内存占用

检查你的DataFrame:如果包含大量object类型列(尤其是长字符串),可以将重复值多的列转为category类型;数值列尽量使用更紧凑的类型(比如int32替代int64,float32替代float64),减少原始数据的内存占用,间接降低写入时的内存压力。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 04:46:18