Я пытаюсь получить огромные данные с сервера около 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-е решения, но не повезло, я также знаю, что это опубликовано много раз, но я думаю, что моя проблема немного другая. Пожалуйста, дайте ваше ценное предложение, каждое предложение будет оценено.
Было бы гораздо меньше памяти, если вы выводите JSON напрямую в файл при чтении строк из базы данных. Например, вы могли бы сначала вывести {"data":[
чтобы начать json, затем выведите каждую строку, закодированную json_encode, но разделенную запятыми. Наконец, закройте JSON с ]}
Теперь у вас есть JSON в файле, вы можете перемотка для начала и использовать fpassthru отправить его как ответ.
Таким образом, вы можете иметь дело с произвольно большими ответами, поскольку вам никогда не придется хранить все это в памяти.
Работа с таким большим файлом JSON — совсем другое дело 🙂
Что бы вы ни пытались сделать с полмиллиона записей на стороне клиента, попробуйте сделать это на сервере. Если вам просто нужно отобразить их, вы можете рассмотреть пейджинг. Получите что-то вроде первых 1000 записей (например, LIMIT 1000) и позвольте пользователю перемещаться по остальным.
Здесь у вас есть псевдокод для вас:
while (there are rows to get) {
rows = get the next 1000 rows
write down the rows
}
Работает на любом языке, просто адаптируйте id: D
Спасибо всем, кто уделил мне время, Теперь моя часть проблемы решена. Поэтому я думаю, что решение должно быть здесь, с помощью этого решения вы можете получить (или показать в браузере) От 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 '[]';
}
Спасибо всем за правильное направление, особенно за Пола Диксона.