Pandas json_normalize не работает с большим файлом JSON в Python

#python #json #pandas

#Python #json #pandas

Вопрос:

Я пытаюсь нормализовать большой (около 900 МБ) файл json в фрейм данных pandas, используя функцию json_normalize() . Это работает для всех других файлов, которые я обрабатываю (размер которых составляет около 150-500 МБ), хотя для завершения каждого из них требуется несколько минут. Однако с этим файлом он, похоже, просто запускается вечно и никогда не завершается. Я попытался прочитать файл json непосредственно в фрейм данных с помощью read_json() перед нормализацией, а также просто загрузить json из файла с помощью json.loads() . Оба метода дают одинаковый результат. Код, который я использую, является:

 import pandas as pd
import json

path = mf.getPath('dataFile.json')
testTrials = json.loads(open(path)) #testTrials = pd.read_json(path)
testTrials = json_normalize(testTrials['rows'])
  

Комментарии:

1. Сколько оперативной памяти имеет ваша система? Насколько вложенной является ваша структура данных? Вам нужны все данные, загруженные во фрейм? Данный nested_to_record (используемый json_normalize ) выполняет глубокую копию для каждого dict, вам понадобится много памяти, я думаю, больше, чем 3-4 ГБ. Посмотрите, сколько оперативной памяти использует файл размером 500 МБ для оценки.

2. @Rho он ограничивает доступные 8 ГБ оперативной памяти. Я использовал новый метод, который использует ijson для чтения построчно, это позволяет завершить процесс, но он занимает 30 минут.

Ответ №1:

Вы можете разделить большой файл JSON на несколько блоков и обрабатывать по одному за раз. Код, подобный этому:

 from itertools import zip_longest

def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return zip_longest(*args, fillvalue=fillvalue)

dfs = []
chunk_size = 1000
for json in grouper(jsons,chunk_size):
    df = json_normalize(json)
    dfs.append(df)
pd.concat(dfs)