Чтение довольно больших файлов json в Python [дубликаты]

Possible Duplicate:
Is there a memory efficient and fast way to load big json files in python?

Так что у меня есть довольно большие файлы в формате JSON. Самый маленький - 300 МБ, но это, безусловно, самый маленький. Остальные - несколько ГБ, где-то от 2 ГБ до 10 ГБ +.

Кажется, у меня не хватает памяти при попытке загрузить файл с помощью Python. В настоящее время я просто провожу несколько тестов, чтобы примерно узнать, сколько времени потребуется, чтобы разобраться с этим материалом, чтобы узнать, куда идти дальше. Вот код, который я использую для проверки:

<code>from datetime import datetime
import json

print datetime.now()

f = open('file.json', 'r')
json.load(f)
f.close()

print datetime.now()
</code>

Не удивительно, что Python дает мне MemoryError. Похоже, что json.load () вызывает json.loads (f.read ()), который пытается сначала выгружать весь файл в память, что явно не сработает.

В любом случае, я могу решить это чисто?

Я знаю, что это старое, но я не думаю, что это дубликат. Хотя ответ один и тот же, вопрос другой. В «дубликате» вопрос заключается в том, как эффективно читать большие файлы, тогда как этот вопрос касается файлов, которые вообще не помещаются в память. Эффективность не требуется.

 Tom Carrick30 апр. 2012 г., 12:45
Ну, я бы хотел прочитать это сразу. Один из моих потенциальных планов - пройти через него один раз и поместить все в базу данных, чтобы я мог получить к ней более эффективный доступ.
 Gareth Latty30 апр. 2012 г., 12:40
Проблема заключается в том, что если файл JSON представляет собой один гигантский список (например), то его синтаксический анализ в Python не будет иметь большого смысла без одновременного выполнения всего этого. Полагаю, вам лучше всего найти модуль, который обрабатывает JSON, такой как SAX, и дает вам события для запуска массивов и прочего, а не для предоставления вам объектов. К сожалению, этого нет в стандартной библиотеке.
 Gareth Latty30 апр. 2012 г., 12:46
Если вы не можете поместить весь файл как текст в память, я искренне сомневаюсь, что вы поместите весь файл как объекты Python в память. Если вы хотите поместить его в базу данных, мой ответ может быть полезным.
 tskuzzy30 апр. 2012 г., 12:39
Похожий, если не тот же вопрос: / Stackoverflow.com вопросы / 2400643 / ...
 yazu30 апр. 2012 г., 12:50
Для любой нетривиальной задачи обработки файлов JSON такие размеры могут занять несколько недель или месяцев.

Ответы на вопрос(1)

Решение Вопроса

Ijson - модуль, который будет работать с JSON как поток, а не как файл блока.

Редакция: тоже стоит посмотреть - комментарий Кашифа околоjson-streamer.

 kashif19 дек. 2014 г., 12:38
Я обнаружил, что ijson требует полного json, прежде чем он будет транслировать его - я бы предпочел что-то, что может работать с частичным json, когда оно станет доступно. Не могу найти ничего, так что написал мой собственный, он называется Jsonstreamer и доступен на GitHub и в магазине cheeseshop
 Tom Carrick30 апр. 2012 г., 12:51
Благодарность! Я проверю это в надежде, что мне не придется прибегать к использованию Java.
 kashif12 февр. 2015 г., 18:34
@ JeremyCraigMartinez Как уже упоминалось в Lattyware, сделать это должно быть довольно просто. Я могу добавить поддержку управления контекстом и, вероятно, сделаю это в следующем выпуске. если вам потребуются какие-либо другие функции или обнаружены ошибки, вы, скорее всего, привлечете мое внимание, решив проблему с github.
 Gareth Latty06 февр. 2015 г., 13:46
@ JeremyCraigMartinez Похоже, вам просто нужно сделатьwith open(some_file) as file: for line in file: streamer.consume(line). Было бы неплохо иметь удобный метод (или, что еще лучше, контекстный менеджер) для (и учтите, что для данного случая использования полагаться на разумные разрывы строк, вероятно, плохая идея - чтение файла в блоках по размеру, наверное, лучший вариант).
 Henrik Heino06 авг. 2016 г., 15:43
Я также написал библиотеку, которая может открывать файлы JSON любого размера. Моя библиотека загружает объект, который действует как обычный dict или массив, но в действительности он загружает больше материала только тогда, когда это необходимо. Вы можете найти, если от G, ithub.

Ваш ответ на вопрос