Ошибка исчерпания памяти для json_parse с PHP - PullRequest
5 голосов
/ 09 февраля 2011

У меня есть следующий код:

<?php
$FILE="giant-data-barf.txt";

$fp = fopen($FILE,'r');

//read everything into data
$data = fread($fp, filesize($FILE));
fclose($fp);

$data_arr = json_decode($data);
var_dump($data_arr);
?>

Файлiant-data-barf.txt, как следует из его названия, представляет собой огромный файл (сейчас его размер составляет 5,4 МБ, но он может достигать нескольких ГБ)

Когда я выполняю этот скрипт, я получаю следующую ошибку:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 71 bytes) in ........./data.php on line 12

Я посмотрел на возможные решения и увидел это:

ini_set('memory_limit','16M');

и мой вопрос: есть ли предел тому, насколько большой я должен установить свою память? Или есть лучший способ решения этой проблемы?

Ответы [ 2 ]

8 голосов
/ 09 февраля 2011

ЭТО ОЧЕНЬ ПЛОХАЯ ИДЕЯ , тем не менее, вам нужно установить

ini_set('memory_limit',filesize($FILE) + SOME_OVERHEAD_AMOUNT);

потому что вы читаете все это в память. Возможно, вам придется установить предел памяти в два размера файла, поскольку вы также хотите JSON_DECODE

ЗАМЕТЬТЕ, ЧТО НА ВЕБ-СЕРВЕРЕ ЭТО БУДЕТ ПОТРЕБИТЬ МАССОВЫЕ СУММЫ ПАМЯТИ, И ВЫ НЕ ДОЛЖНЫ ДЕЛАТЬ, ЕСЛИ ФАЙЛ БУДЕТ МНОГО ГИГАБАЙТОВ, КАК ВЫ СКАЗАЛЕ !!!!

Это действительно гигантский JSON BLOB? Вам следует обратить внимание на преобразование этого в базу данных или другой формат, в котором вы можете использовать произвольный или строковый доступ с помощью до синтаксического анализа с помощью PHP.

2 голосов
/ 09 февраля 2011

Я дал всем своим серверам memory_limit из 100 МБ ... проблем пока не возникло.

Я хотел бы как-нибудь разделить этот файл, или избавиться от него и использоватьбазы данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...