Импорт ОГРОМНЫХ JSON-кодированных массивов без ограничения памяти - PullRequest
4 голосов
/ 31 мая 2011

У меня есть файл, который содержит два массива JSON;один содержит имена столбцов с четырьмя значениями, а другой массив содержит более 10000 записей.

Я использую Symfony и Propel;при использовании json_decode выбрасывается допустимый объем памяти.В моем php.ini я указал максимальный размер до 500 МБ, но файл выполнялся в течение 10 секунд и выдавал ошибку.

файл данных содержит

{
"columns_map":["Name","Age","Address","State"],
"rows_map":{"1":["value1","value2","value3","value4"],
"4":["value1","value2","value3","value4"]
"6":["value1","value2","value3","value4"].......upto 10,000 and more records
}
}

на моей странице Symfonyу меня есть этот код

$file = "path to the file";
$content = file_get_contents($file);
$array = json_decode($content);

Я хочу сохранить значения массива файлов в массиве PHP и процесс, и я хочу читать независимо от ограничения памяти, установленного в php.ini.

Я хочу сохранить все значения сразу или выплюнуть файл и сохранить (например, чтение первых 1000 записей и цикл до конца, но как прочитать первые 1000 записей в массиве row_map?).

Ответы [ 3 ]

1 голос
/ 01 июня 2011

Убедитесь, что вы обновляете правильный php.ini (в системах Linux обычно есть отдельные файлы для Apache, CGI и CLI).Вы можете убедиться, что вам разрешено обновлять значение памяти, проверив возвращаемое значение ini_get('memory_limit') в том же контексте.И не забудьте перезапустить ваш веб-сервер, если вы используете Apache или какой-либо CGI-сервер.

Даже элементы размером 10 КБ не должны исчерпывать 500 МБ памяти;если это действительно так, вы, вероятно, столкнетесь с той же проблемой, пытаясь разобрать ее самостоятельно.Непрактично читать и анализировать фрагменты необработанных строк JSON.Выберите формат, который лучше подходит, вставьте данные в базу данных или запишите данные порциями, чтобы разделить файлы, и анализируйте каждый по отдельности.

0 голосов
/ 18 августа 2011

Я решил это, создав новый собственный класс с функциями кодирования и декодирования

0 голосов
/ 01 июня 2011

Можно ли хранить файлы отдельно?Тогда это уже намного проще.Рассмотрим, например, следующую структуру:

  • 1.json (первые 1000 строк + карта столбцов)
  • 2.json (вторые 1000 строк + карта столбцов)

Другая проблема может быть движущей силой.Я наблюдал похожую проблему с Doctrine, которая вынудила меня использовать обычный PDO для вставки объектов.Doctrine засоряет всю память и процессор, в то время как подготовленные операторы с PDO могут легко справиться с такого рода томами.

Другой вариант - использовать CSV (я знаю, что это очень 1980-е годы).Но это должно позволить вам прочитать это за строку.

...