Python中怎么将大型JSON数组分批流式解析到内存?

星宇同学_6691

星宇同学_6691

2026-10-30

175人浏览

原创

ijson通过流式解析避免OOM,用ijson.items()按路径逐个提取数组元素,需指定yajl2_cffi后端、正确处理编码,并手动容错处理不规范数据。

python中怎么将大型json数组分批流式解析到内存?

用 ijson 按需拉取数组元素,避免一次性加载

大型 JSON 文件(比如几百 MB 的日志数组)用 json.load() 会直接 OOM。核心思路是不解析整个文档,而是定位到目标数组后,逐个读取其内部对象。ijson 是最成熟的选择,它基于 C 扩展(ijson.backends.yajl2_cffi),边流式读取边触发事件,内存占用稳定在 KB 级别。

常见错误是误以为 ijson.parse() 能直接拿到 Python 对象——它返回的是 (event, value) 元组流,真正要用的是 ijson.items() 或 ijson.kvitems() 这类封装函数:

  • 若 JSON 是纯数组:ijson.items(file_obj, "item") 直接迭代每个元素
  • 若数组嵌套在字段里(如 {"data": [...]}):用 ijson.items(file_obj, "data.item")
  • 路径中的 item 是 ijson 的保留字,代表数组任意下标元素,不是字面量

ijson.items() 的参数陷阱和性能关键点

很多人卡在路径写错或编码异常上。ijson 默认按字节流读取,如果文件含 BOM 或非 UTF-8 编码(如 GBK 日志),必须显式传入解码后的 io.TextIOWrapper,否则抛 UnicodeDecodeError 或静默乱码。

性能差异主要来自后端选择:yajl2_cffi 比纯 Python 后端快 5–10 倍,但需安装 cffi;Windows 上可能需先装 Visual Studio Build Tools。实操建议:

  • 始终指定后端:ijson.parse(file_obj, multiple_values=True, use_float=True, backend="yajl2_cffi")
  • 用 buffer_size=65536(默认值)足够,调大反而可能增加延迟
  • 避免在循环内反复调用 ijson.items()——每次都会重置解析器,应复用一次打开的文件对象

处理中途失败、数据不规整的容错策略

真实场景中,JSON 数组可能被截断、混入脏数据(如某行多一个逗号)、或部分对象字段缺失。ijson 默认遇到语法错误就抛 ijson.common.IncompleteJSONError 或 ValueError,无法跳过。

arcgis-js
arcgis-js

提供 ArcGIS Maps SDK for JavaScript 开发辅助,涵盖 2D/3D 地图视图、图层管理、数据可视化、空间分析等功能模块的参考和示例指导。

下载

解决办法是手动封装一层迭代器,捕获异常并尝试从下一个合法位置继续(依赖 yajl2 的恢复能力):

import ijson
def robust_json_array_iter(file_path, path="item"):
    with open(file_path, "rb") as f:
        parser = ijson.parse(f, backend="yajl2_cffi")
        # 手动跳过开头直到到达数组起始
        while True:
            try:
                event, value = next(parser)
                if event == "start_array" and path == "item":
                    break
            except StopIteration:
                return
        # 用 items 重新绑定数组上下文
        f.seek(0)
        for obj in ijson.items(f, path, use_float=True, backend="yajl2_cffi"):
            try:
                yield obj
            except (ijson.common.IncompleteJSONError, ValueError):
                continue

注意:这种容错会丢失错误位置信息,仅适用于“宁可漏掉几条也不中断”的场景;若需精确定位,得改用 jsonstream 或自研基于 json.JSONDecoder.raw_decode 的增量解析。

替代方案对比:什么时候不该用 ijson?

ijson 强在数组流式提取,但对以下情况不适用:

  • 需要随机访问数组某下标(如取第 10000 个元素)——ijson 必须顺序遍历,此时应先用 mmap + 正则定位行偏移
  • JSON 是单个巨型对象而非数组(如 {"logs": [...], "meta": {...}})——用 ijson.kvitems() 提取键值对更合适
  • 环境受限无法装 C 扩展(如某些 Serverless 平台)——改用 jsonlines 库,但前提是数据本身是 JSON Lines 格式(每行一个 JSON)

真正棘手的是数组里套数组(如 [{"items": [...]}, ...]),这时路径要写成 "item.items.item",且必须确认内层数组结构一致——一旦某对象缺 items 字段,ijson.items() 就会静默跳过整个外层对象,这点极易被忽略。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

python js json json数组

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1831

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4924

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1789

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

29457

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3507

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3527

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1223

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

616

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2743

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习