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
相关产品推荐
相关产品推荐

