解析ijson中的json文件时出现内存问题

时间:2016-06-18 14:27:46

标签: python json

本教程https://www.dataquest.io/blog/python-json-tutorial/有一个600MB的文件可供使用,但是当我运行他们的代码时

import ijson

filename = "md_traffic.json"
with open(filename, 'r') as f:
    objects = ijson.items(f, 'meta.view.columns.item')
    columns = list(objects)

我正在等待10分钟以上的文件被读入ijson,我真的很困惑这应该是合理的。不应该解析吗?我错过了什么吗?

3 个答案:

答案 0 :(得分:2)

主要问题不是您在解析后创建list(仅将单个结果收集到单个结构中),而是使用ijson提供的默认pure-python后端。

还有其他可以使用的后端更快。在ijson's homepage中解释了如何导入它们。 yajl2_cffi后端是目前最快的,但我创建了一个新的yajl2_c后端(有pull request等待接受),表现更好。

在使用yajl2_cffi后端的笔记本电脑(Intel(R)Core(TM)i7-5600U)中,您的代码运行时间约为1.5分钟。使用yajl2_c后端它运行〜10.5秒(python 3)和~15秒(python 2.7.12)。

编辑:@ lex-scarisbrick当然也是正确的,如果你只对列名感兴趣,你可以快速摆脱循环。

答案 1 :(得分:1)

这看起来像是在这里找到的教程的直接复制/粘贴:

https://www.dataquest.io/blog/python-json-tutorial/

list()函数输出周围的ijson.items之所以花费这么长时间。这有效地强制解析整个文件,然后返回任何结果。利用ijson.items作为生成器,第一个结果几乎可以立即返回:

import ijson

filename = "md_traffic.json"
with open(filename, 'r') as f:
    for item in ijson.items(f, 'meta.view.columns.item'):
        print(item)
        break

编辑:本教程的下一步是print(columns[0]),这就是我在答案中打印第一项的原因。此外,目前还不清楚问题是针对Python 2还是3,所以答案使用的语法在两者中都有效,尽管不是很优秀。

答案 2 :(得分:1)

我尝试运行你的代码,我在25分钟后杀了程序。所以是10分钟,这是合理的快速。