2012-04-19 2 views
1

У меня есть доступ к набору файлов (около 80-800 мб каждый). К сожалению, в каждом файле есть только одна строка. Строка содержит ровно один объект JSON (список списков). Каков наилучший способ загрузить и проанализировать его на более мелкие объекты JSON?Каков наилучший способ загрузки больших списков JSON в Python?

+3

Я полагаю, вы, по крайней мере, считается [стандартный модуль JSON] (http://docs.python.org/library/json.html). – C2H5OH

+0

Возможный дубликат [Split 95mb JSON массив в меньшие куски?] (Http://stackoverflow.com/questions/7052947/split-95mb-json-array-into-smaller-chunks) –

+0

@ C2H5OH - да, я пытаясь не загружать всю вещь в память. –

ответ

5

Существует аналогичное сообщение here. Вот решение они предложили:

import json 
with open('file.json') as infile: 
    o = json.load(infile) 
    chunkSize = 1000 
    for i in xrange(0, len(o), chunkSize): 
    with open('file_' + str(i//chunkSize) + '.json', 'w') as outfile: 
     json.dump(o[i:i+chunkSize], outfile) 
+1

убил, это то, что говорит оболочка python – ashish

3

Если вы пытаетесь избежать загрузок всего списка в память, можно обработать файл как текст первым:

Используйте стек для отслеживания открытого и закрытие скобок/кавычек. Сканирование через строку для любого из открывающих устройств или текущего ближе. При сканировании через текст посмотрите только текст ближе. Нажимайте один, когда вы читаете открыватель, и вытащите его, когда найдете ближе.

Полный набор для JSON является [ ->], { ->} и " ->". Вы должны исключить \". Вы можете проверить спецификацию на http://www.json.org/

Тогда всякий раз, когда ] встречаются и стек имеет только один пункт (верхний уровень «[») после выскакиваю соответтсвующие [, то вы знаете, что пришло время, чтобы начать новую строку.

И, наконец, вы должны убедиться, что первые [ и последние ] не отображаются в вашем выводе.

Это даст вам отдельные объекты JSON для каждого элемента списка, каждый из которых находится в отдельной строке файла.

Если вы копаетесь в библиотеке JSON python, должны быть некоторые функции, которые также разбирают JSON. Вы можете использовать их, даже если они не являются частью публичного интерфейса.

Конечно, вы можете достичь этого, загрузив строку с использованием библиотеки JSON, а затем сбросив ее по элементам (или нескольким элементам) в соответствии с другим ответом.

+1

Зачем нужен такой подход к низкоуровневому сканированию, когда совершенно хороший модуль json поставляется со стандартной lib? См. Ответ @ linker – jdi

+0

Я предполагаю, что он не хочет иметь накладные расходы памяти, поскольку объект json фактически хранится в памяти. открытый интерфейс библиотеки json этого не позволяет. Я даже упоминаю, что он мог взломать эту библиотеку и использовать некоторые вспомогательные функции, хотя я и не видел их. – chees

+0

Да, но проблема с памятью не является проблемой для одноразовой пакетной обработки, как это предлагается в другом ответе. Это не должно быть производственным решением, чтобы просто доставить его до более мелких объектов. – jdi

0

Модуль pandas 0.21.0 теперь поддерживает chunksize как часть read_json. Вы можете загружать и управлять один кусок за один раз:

import pandas as pd 
chunks = pd.read_json(file, lines=True, chunksize = 100) 
for c in chunks: 
    print(c) 
Смежные вопросы