Python:解析大型json文件

x33g5p2x  于 2023-07-01  发布在  Python
关注(0)|答案(3)|浏览(156)

我有一个很大的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')
qnyhuwrf

qnyhuwrf1#

如果有人正在寻找一种方法来解析bz2中压缩的wikidata json dump,这里有一段代码:

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]))
z31licg0

z31licg02#

在没有任何其他建议或现有代码的情况下,我建议打开一个流并手动解析大括号和方括号(分别为{[),直到您拥有一个完整的对象{ ... }并对其运行反序列化。这将允许您在利用现有JSON库的同时对JSON进行分块。
这不是我通常推荐的解决方案,但如果现有的库不能满足您的需求,这是我能想到的最快和最可靠的解决方案。

piztneat

piztneat3#

虽然已经压缩了文件本身,但是一旦使用Python的json包将其加载到Python中,就需要将整个文件加载到内存中。由于Python的工作方式,如果文件是100 MB,您通常最终会使用更多。我最近观察到,加载一个324 MB的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)

.

相关问题