#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)