如何在Python中分批写入大体积JSON文件?
分批写入大体积JSON文件(避免内存溢出)
直接把所有数据加载到内存再转JSON会导致内存占用过高,我们可以手动拆分JSON结构,分三部分写入文件:
核心思路
- 先写入JSON头部的元数据部分,到
"mappings": [为止 - 分批生成并写入
mappings数组中的每个元素,按需加载数据不占内存 - 最后写入数组闭合符
]和JSON文件的闭合符}
代码实现
import json def generate_mappings(total): # 模拟生成大量映射数据,用生成器按需产出,不占用内存 for idx in range(total): yield {"mapped_data": f"data_{idx}"} def write_large_json(metadata, mappings_generator, output_file): with open(output_file, 'w', encoding='utf-8') as f: # 处理元数据:移除mappings键(避免重复写入) core_metadata = {k: v for k, v in metadata.items() if k != "mappings"} # 转成JSON字符串后,去掉末尾的闭合符} core_json = json.dumps(core_metadata, indent=2)[:-1] # 写入元数据并拼接mappings数组的开头 f.write(f"{core_json},\n \"mappings\": [\n") is_first = True for item in mappings_generator: if not is_first: # 非第一个元素,先写逗号换行分隔 f.write(",\n") # 格式化单个映射对象,添加对应缩进保证格式统一 item_json = json.dumps(item, indent=2) indented_item = " " + item_json.replace("\n", "\n ") f.write(indented_item) is_first = False # 闭合数组和整个JSON文件 f.write("\n ]\n}") # 用法示例 if __name__ == "__main__": metadata = {"title": "sample one", "id": 1} # 生成100万条映射数据(替换成你的实际数据源) mappings_gen = generate_mappings(1000000) write_large_json(metadata, mappings_gen, "large_result.json")
关键细节说明
- 生成器按需加载:用生成器替代列表,每次只生成一条数据,完全不占用额外内存
- 逗号处理:通过
is_first标记控制逗号位置,避免JSON语法错误 - 格式一致性:手动调整缩进,保证生成的JSON和目标格式完全匹配
内容的提问来源于stack exchange,提问作者subhash Amale
相关产品推荐
相关产品推荐

