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

Python处理API返回海量列表数据时避免内存溢出的方案咨询

解决方案

针对GB级分页API数据写入JSON的内存优化需求,可采用流式增量写入方案,完全避免加载全量数据到内存,也不会出现重复读取已有文件内容的额外开销:

核心实现逻辑

  • 初始化阶段:以写入模式打开目标文件,先写入JSON数组的开头标识符[,此时无需加载任何业务数据
  • 分页处理阶段:
    • 每次仅拉取单页API数据,处理完当前页即可释放对应内存,全程仅保留单页数据的内存占用
    • 非首页数据写入前先追加逗号,,避免JSON语法错误
    • 逐行序列化当前页的单条数据写入文件,不需要整页序列化后再写入
  • 收尾阶段:所有分页拉取完成后,写入JSON数组的结尾标识符],即可得到符合语法规范的完整JSON数组文件

你担心的每次打开文件写入占内存的问题,本质是错误的实现方式需要读取全量已有内容修改导致的,上述方案全程以追加模式写入,完全不需要读取已有文件内容,不会产生额外内存开销。

可选优化方案

如果后续使用数据的工具支持JSON Lines格式(每行一条独立JSON对象),可以进一步简化实现,不需要处理逗号和数组闭合标识,后续读取也可以逐行加载,更适合大数据场景:

  • 每次拿到单页数据后,遍历每条数据序列化后加换行符直接写入文件即可
  • 主流大数据处理工具(Spark、Flink等)、日志分析工具都原生支持JSON Lines格式,通用性更强

示例代码(Python)

import json
import requests

def stream_write_json(pagination_api, total_pages, output_path):
    with open(output_path, "w", encoding="utf-8") as f:
        # 写入JSON数组开头
        f.write("[")
        is_first_item = True
        for page_idx in range(total_pages):
            # 拉取当前页数据,内存仅保留当前页内容
            resp = requests.get(pagination_api, params={"page": page_idx})
            current_page = resp.json()
            # 逐行写入当前页的每条数据
            for item in current_page:
                if not is_first_item:
                    f.write(",")
                f.write(json.dumps(item, ensure_ascii=False))
                is_first_item = False
            # 可选:刷入磁盘避免程序崩溃丢数据,同时记录当前分页断点
            f.flush()
        # 闭合JSON数组
        f.write("]")

# JSON Lines格式实现更简单
def stream_write_jsonl(pagination_api, total_pages, output_path):
    with open(output_path, "w", encoding="utf-8") as f:
        for page_idx in range(total_pages):
            resp = requests.get(pagination_api, params={"page": page_idx})
            current_page = resp.json()
            for item in current_page:
                f.write(json.dumps(item, ensure_ascii=False) + "\n")
            f.flush()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 00:39:03