加载返回加载中的“ /usr/lib/python3.6/json/init.py”,第296行(fp.read(),MemoryError

时间:2018-08-24 15:38:05

标签: python arrays json parsing jsonparser

我有一个大的json文件(2.4 GB)。我想在python中解析它。数据如下所示:

[
{
  "host": "a.com",
  "ip": "1.2.2.3",
  "port": 8
},
{
  "host": "b.com",
  "ip": "2.5.0.4",
  "port": 3

},
{
  "host": "c.com",
  "ip": "9.17.6.7",
  "port": 4
}
]

我运行此python脚本parser.py来加载要分析的数据::

import json
from pprint import pprint


with open('mydata.json') as f:
    data = json.load(f)
  

回溯(最近一次通话最后一次):文件“ parser.py”,位于第xx行          data = json.load(f)载入中的文件“ /usr/lib/python3.6/json/init.py”,第296行       返回负载(fp.read(),MemoryError

1)您能否建议我如何加载大文件进行解析,而不会出现此类错误?

2)还有其他方法吗?

1 个答案:

答案 0 :(得分:1)

问题是因为文件太大而无法加载到程序中,所以您必须一次加载各部分。
我建议使用ijsonjson-streamer,它们可以迭代地加载到json文件中,而不是尝试一次将整个文件加载到内存中。

这是使用ijson的示例:

import ijson

entry = {}  # Keeps track of values for each json item
parser = ijson.parse(open('mydata.json'))

for prefix, event, value in parser:
    # Start of item map
    if (prefix, event) == ('item', 'start_map'):
        entry = {}  # Start of a new json item
    elif prefix.endswith('.host'):
        entry['host'] = value  # Add value to entry
    elif prefix.endswith('.ip'):
        entry['ip'] = value
    elif prefix.endswith('.port'):
        entry['port'] = value
    elif (prefix, event) == ('item', 'end_map'):
        print(entry)  # Do something with complete entry object

每个prefix在json中存储要插入的当前项目的前缀路径。 event用于检测映射或数组的开始/结束。 value用于存储要迭代的当前对象的值。