Разбор большого файла JSON - программирование
Подтвердить что ты не робот

Разбор большого файла JSON

Я работаю над cron script, который попадает в API, получает JSON файл (большой массив объектов) и сохраняет его локально. Как только это будет завершено, другой script должен проанализировать загруженный файл JSON и вставить каждый объект в базу данных MySQL.

В настоящее время я использую file_get_contents() вместе с json_decode(). Это попытается прочитать весь файл в памяти, прежде чем пытаться его обработать. Это было бы хорошо, за исключением того, что мои файлы JSON обычно будут варьироваться от 250 МБ-1 ГБ+. Я знаю, что могу увеличить свой предел памяти PHP, но это не кажется лучшим ответом на мой взгляд. Я знаю, что я могу запускать fopen() и fgets() для чтения файла в строчном порядке, но мне нужно прочитать файл в каждом объекте json.

Есть ли способ чтения в файле для одного объекта или существует другой подобный подход?

4b9b3361

Ответ 1

Это действительно зависит от того, что содержат файлы json.

Если вы открываете файл, один снимок в память не является вариантом, ваш единственный вариант, по которому вы ускользали, - fopen/fgets.

Чтение строки за строкой возможно, и если эти json-объекты имеют согласованную структуру, вы можете легко обнаружить, когда json-объект в файле начинается и заканчивается.

Как только вы соберете весь объект, вы вставляете его в db, а затем переходите к следующему.

Там не так много. алгоритм обнаружения начала и конца объекта json может усложняться в зависимости от вашего источника данных, но я уже делал что-то подобное раньше с гораздо более сложной структурой (xml), и он работал нормально.

Ответ 2

попробуйте этот lib https://github.com/shevron/ext-jsonreader

Существующий ext/json, который поставляется с PHP, очень удобен и простой в использовании - но он неэффективен при работе с большими количество данных JSON, так как требуется считывание всех данных JSON в память (например, с помощью file_get_contents()), а затем преобразование в переменную PHP сразу - для больших наборов данных это занимает много памяти.

JSONReader предназначен для экономии памяти - он работает на потоках и может считывать данные JSON из любого потока PHP без загрузки всего данных в память. Это также позволяет разработчику извлекать определенные значения из потока JSON без декодирования и загрузки всех данных в память.

Ответ 3

Наилучшее возможное решение:

Используйте какой-то разделитель (разбиение на страницы, временную метку, идентификатор объекта и т.д.), который позволяет вам считывать данные в небольших кусках по нескольким запросам. Это решение предполагает, что у вас есть какой-то контроль над созданием этих файлов JSON. Я основываю свое предположение на:

Это было бы хорошо, за исключением того, что файлы my JSON обычно будут диапазон от 250 МБ-1 ГБ +.

Чтение и обработка 1 ГБ данных JSON просто смешно. Более подходящий подход определенно необходим.