«/usr/lib/python3.6/json/init.py», строка 296, в ответной загрузке нагрузки (fp.read (), MemoryError - PullRequest
0 голосов
/ 24 августа 2018

У меня большой файл json (2,4 ГБ). Я хочу разобрать это в 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)

Traceback (последний вызов был последним): файл "parser.py", строка xx, в data = json.load (f) Файл "/usr/lib/python3.6/json/init.py", строка 296, в загрузке возврат загрузки (fp.read (), MemoryError

1) Не могли бы вы посоветовать мне, как загружать большие файлы для разбора без такой ошибки?

2) Есть ли альтернативные методы?

1 Ответ

0 голосов
/ 24 августа 2018

Проблема в том, что файл слишком велик для загрузки в программу, поэтому вы должны загружать разделы одновременно.
Я бы рекомендовал использовать ijson или json-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 используется для хранения значения текущего итерируемого объекта.

...