Python:解析大型 JSON 文件

3
我有一个大的json文件,它是日志数据,并已经被压缩成bz2格式(myfile.json.bz2)。bz2文件大小为90MB。我搜索了好多方法,想找到一个能有效解析压缩的bz2 json文件的好方法或博客文章,但是没有找到。由于文件太大,做像这样的事情是不可能的。
with open('data.json') as data_file:    
    data = json.load(data_file)

什么是最佳方法?

经过一些研究,我发现有一个Python包可以读取bz2文件。

input_file = bz2.BZ2File(filename, 'r')

2
你需要一个增量式的JSON解析器,例如可以参考这个答案:(链接) 另一个可能的选择是这个:(链接) - ErikR
由于BZ2File具有返回任意字节数的read方法,因此我可能会考虑尝试将json作为流读取,使用类似https://pypi.python.org/pypi/ijson/的东西。 - njzk2
3个回答

2

如果有人正在寻找一种解析以bz2压缩的wikidata json转储的方法,这里是一段代码片段:

import bz2
import json

f = bz2.BZ2File("latest-all.json.bz2", "r")
next(f)  # skip the first line
for line in f:
    print(json.loads(line[:-2]))

那么神奇的“-2”代表着白色换行符\n\r - dzieciou
1
"-2"代表逗号“,”和行尾。从性能方面来看,最快的方法是使用JSON流解析器进行解析。 - amirouche

1
如果没有其他建议或已有代码,我建议打开流并手动解析大括号和方括号(分别为{[),直到您拥有完整的对象{ ... },然后运行反序列化操作。这将允许您在利用现有的JSON库的同时对JSON进行切块处理。
这不是我通常推荐的解决方案,但如果现有的库不符合您的需求,它是我能想到的最快速、最可靠的解决方案。

3
使用类似于http://pykler.github.io/yajl-py/的逐步JSON解析器会更加简单和安全,而不是自己去研究。 - Daniel Robinson
啊,我不知道有这个库。 - Spencer Ruport

0
虽然您已经压缩了文件本身,但一旦您使用Python的json包将其加载到Python中,您最终会将整个文件加载到内存中。由于Python的工作方式,如果文件大小为100MB,您通常会使用更多的内存。我最近观察到加载一个324MB的JSON占用了1.5GB的内存。
现在,如果问题是存储空间,那么压缩是解决方法,但是,如果您需要将其运行到程序中,您可能希望考虑如何逐个对象地读取JSON,而不是将整个内容加载到内存中。
@amirouche提出的建议应该可以解决问题,如果您愿意手动操作或者尝试其他可用的解决方案,https://pypi.org/project/json-lineage/可能是一个可能的选择。免责声明,这段代码是我编写的。
我相信还有其他工具可以实现逐个对象地读取JSON的功能。
如果您最终使用json-lineage,请参考以下简要指南,它可能对您有所帮助:
from json_lineage import load

jsonl_iter = load("path/to/file.json")


for obj in jsonl_iter:
    do_something(obj)

.


1
/help/promotion 你需要非常清楚和明确地声明与你所推广的事物之间的任何关联。 - starball

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接