如何导出大型Pandas DataFrame到JSON且避免高内存占用?
大DataFrame流式导出JSON以降低内存占用
我有一个大型DataFrame,导出为JSON文件后大小约3.5GB。导出过程中发现额外占用了7GB内存,推测Pandas是先将完整的JSON字符串存入内存后再写入文件,而非直接流式生成并写入字节数据;此外写入时还额外占用3.5GB内存用于字符串转字节编码,疑惑为何不采用分块编码方式。
请问是否存在方法可以直接将JSON导出到文件,无需先将完整JSON存入内存,仅使用约10-50MB的缓冲内存即可?
相关代码
from time import sleep import pandas as pd large_df: pd.DataFrame sleep(5) with open("exported.json", "w") as f: large_df.to_json(f, orient="records", date_format="iso") sleep(5)
内存占用情况
内存占用情况由memory-profiler工具生成,对应内存图谱:
解决方案:分块流式导出JSON
Pandas默认的to_json会先在内存中构建完整的JSON字符串,导致内存暴涨。以下两种方法可实现低内存的流式导出:
方法1:Pandas分块迭代+手动处理JSON格式(适配orient="records")
利用iter_chunks将DataFrame切分为小批量,逐块生成JSON并写入文件,同时手动维护JSON数组的结构:
from time import sleep import pandas as pd large_df: pd.DataFrame sleep(5) chunk_size = 10000 # 可根据内存调整,对应单块缓冲约10-50MB with open("exported.json", "w") as f: # 写入JSON数组开头 f.write("[") first_chunk = True for chunk in large_df.iter_chunks(chunk_size=chunk_size): chunk_json = chunk.to_json(orient="records", date_format="iso") if not first_chunk: # 非首块前添加逗号分隔 f.write(",") # 移除块JSON的外层[],写入片段内容 f.write(chunk_json[1:-1]) f.flush() # 立即刷入磁盘,避免内存缓冲堆积 first_chunk = False # 写入JSON数组结尾 f.write("]") sleep(5)
方法2:json模块流式写入(更低内存占用)
用json.JSONWriter逐行处理DataFrame记录,全程仅缓存单条或少量数据:
from time import sleep import pandas as pd import json large_df: pd.DataFrame sleep(5) with open("exported.json", "w") as f: writer = json.JSONWriter(f) writer.write_start_array() first_row = True for _, row in large_df.iterrows(): if not first_row: writer.write_separator() writer.write(row.to_dict()) first_row = False writer.write_end_array() sleep(5)
核心原理
- 分块/逐行处理:每次仅加载小部分数据到内存,生成对应JSON片段后立即写入磁盘,避免构建完整的JSON字符串。
- 手动维护JSON结构:规避Pandas分块导出时的独立数组格式,确保最终输出是合法的JSON数组。
- 强制刷盘:通过
flush()或JSONWriter的流式写入,确保数据及时落地,不占用额外内存缓冲。
内容的提问来源于stack exchange,提问作者karunP
相关产品推荐
相关产品推荐

