почтальон — допустимый объем памяти 1073741824 байта исчерпан (попытка выделить 80 байтов) при получении данных json с сервера в переполнении стека

Я пытаюсь получить огромные данные с сервера около 500000 строк из базы данных в формате json, и получаю ошибку исчерпания памяти. Все работает нормально, когда я пробую 100 строк, но мне нужно получить 500000 строк за один раз. Я использую расширение почтальона, чтобы получить эти данные. Ребята, я не чемпион базы данных, но я пробовал целый день и нашел несколько полезных советов этот этот этот и многое другое, но не повезло.

Я знаю, что это не очень хорошее решение, но я тоже попробовал это ini_set('memory_limit', '-1');

Это то, что я делаю:

 $response["data"] = array();

$result = $db->getData();
while ($data= $result->fetch_assoc()) {
array_push($response["data"], $data);
}

file_put_contents('newData.json', json_encode($response,128));
echoRespnse(200, $response);

Я дал свой 1 день и попробовал почти 100-е решения, но не повезло, я также знаю, что это опубликовано много раз, но я думаю, что моя проблема немного другая. Пожалуйста, дайте ваше ценное предложение, каждое предложение будет оценено.

1

Решение

Было бы гораздо меньше памяти, если вы выводите JSON напрямую в файл при чтении строк из базы данных. Например, вы могли бы сначала вывести {"data":[ чтобы начать json, затем выведите каждую строку, закодированную json_encode, но разделенную запятыми. Наконец, закройте JSON с ]}

Теперь у вас есть JSON в файле, вы можете перемотка для начала и использовать fpassthru отправить его как ответ.

Таким образом, вы можете иметь дело с произвольно большими ответами, поскольку вам никогда не придется хранить все это в памяти.

Работа с таким большим файлом JSON — совсем другое дело 🙂

1

Другие решения

Что бы вы ни пытались сделать с полмиллиона записей на стороне клиента, попробуйте сделать это на сервере. Если вам просто нужно отобразить их, вы можете рассмотреть пейджинг. Получите что-то вроде первых 1000 записей (например, LIMIT 1000) и позвольте пользователю перемещаться по остальным.

1

Здесь у вас есть псевдокод для вас:

while (there are rows to get) {
rows = get the next 1000 rows
write down the rows
}

Работает на любом языке, просто адаптируйте id: D

0

Спасибо всем, кто уделил мне время, Теперь моя часть проблемы решена. Поэтому я думаю, что решение должно быть здесь, с помощью этого решения вы можете получить (или показать в браузере) От 1 до 15 рядов в форме JSON за один раз.

$result = mysql_query($sql);
if(mysql_num_rows($result)){
echo '{"data":[';

$rkt= true;
$my_row=mysql_fetch_assoc($result);
while($my_row=mysql_fetch_row($result)){
if($rkt) {
$rkt= false;
} else {
echo ',';
}
echo json_encode($my_row);
}
echo ']}';
} else {
echo '[]';
}

Сейчас пытаюсь решить 2 часть «Как скопировать все данные JSON в файл .json«, Так что я мог бы скачать его.

Вот file_put_contents('MyFileName', json_encode($my_row)); не работает, с вышеуказанным подходом.

Под редакцией (Раскрыты): Может быть, это можно улучшить более надежным и чистым способом. Но этот также работает для меня, вот полный код для извлечения огромных данных (около 12 lac строк) и без ошибок записать их в файл .json.

$result = mysql_query($sql);
$arr = array();

if(mysql_num_rows($result)){
echo '{"data":[';
$arr[] = '{"data":[';

$rkt= true;

while($my_row=mysql_fetch_row($result)){
//  cast results to specific data types

if($rkt) {
$rkt= false;
} else {
echo ',';
$arr[] = ',';

}
$robi_json = json_encode($my_row,200);
$arr[] = $robi_json;

echo $robi_json;


}

echo ']}';
$arr[] = ']}';
file_put_contents('data_file.json', $arr);
} else {
echo '[]';
}

Спасибо всем за правильное направление, особенно за Пола Диксона.

0
По вопросам рекламы [email protected]