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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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