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

如何在Python中分批写入大体积JSON文件?

分批写入大体积JSON文件(避免内存溢出)

直接把所有数据加载到内存再转JSON会导致内存占用过高,我们可以手动拆分JSON结构,分三部分写入文件:

核心思路

  1. 先写入JSON头部的元数据部分,到"mappings": [为止
  2. 分批生成并写入mappings数组中的每个元素,按需加载数据不占内存
  3. 最后写入数组闭合符]和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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 19:02:17