如何高效处理300MB级Python数据导出以避免OOM问题?
大体积JSON逐行导出的内存溢出解决方案
问题背景
现有样本数据:
{'test1': True, 'test2': [0, 1, 2], 'test3': None}
需要生成约300MB的JSON Lines格式(逐行存储单条JSON)文件。原方案将全量数据加载到内存(赋值给变量a)后遍历写入,直接触发OOM(内存溢出),即使配置8GB交换空间也无法解决。
核心问题
原方案将所有数据一次性加载到内存中,Python的列表和字典对象会产生额外内存开销,导致内存占用远超文件实际大小。解决思路是避免全量加载,采用流式生成/写入的方式。
具体解决方案
方案1:动态生成重复样本(适用于靠样本复制生成大文件的场景)
直接循环生成单条样本并逐行写入,全程仅在内存中保留单条样本数据:
import json # 定义单条样本 sample = {'test1': True, 'test2': [0, 1, 2], 'test3': None} # 预序列化样本,避免重复调用json.dumps提升效率 pre_serialized = json.dumps(sample) + '\n' # 计算需要生成的行数(按单条约100字节估算,300MB≈300万行,可根据实际序列化后大小调整) total_lines = 3 * 10**6 with open('json-dump', 'w') as f: for _ in range(total_lines): f.write(pre_serialized)
方案2:流式解析源数据(适用于数据来自外部大文件的场景)
如果数据存储在大JSON数组文件中,使用ijson库流式解析,避免加载整个文件到内存:
- 先安装依赖:
pip install ijson - 流式处理代码:
import json import ijson # 打开源文件和目标文件,流式读取+写入 with open('large-source.json', 'r') as src_file, open('json-dump', 'w') as dst_file: # 遍历源JSON数组中的每一项 for item in ijson.items(src_file, 'item'): json.dump(item, dst_file) dst_file.write('\n')
额外优化
- 使用
json.dump替代json.dumps直接写入文件,减少中间字符串的内存占用; - 预序列化重复样本可大幅提升写入效率,避免重复序列化的CPU开销。
内容的提问来源于stack exchange,提问作者daisy
相关产品推荐
相关产品推荐

