我试图以json格式从数据库中获取大约500000行的服务器中的大量数据,并导致内存耗尽错误。当我尝试100行时,每件事都可以正常工作,但我需要一次性获取500000行。我正在使用邮递员扩展来获取此数据。伙计我不是数据库的冠军,但我尝试了一整天,发现了一些有用的提示this this this以及更多,但没有运气。
我知道这不是一个好的解决方案,但我也试过这个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);
我已经给了我一天的时间并尝试了近100个解决方案,但没有运气,我也知道这次发布很多次,但我认为我的问题有点不同。请提出宝贵的建议,我们将不胜感激。
答案 0 :(得分:1)
无论您尝试在客户端使用50万条记录,请尝试在服务器上进行操作。如果您只需要显示它们,您可以考虑分页。获取类似前1000条记录的内容(例如LIMIT 1000),让用户浏览其余内容。
答案 1 :(得分:1)
如果在从数据库中读取行时将JSON直接输出到文件,它将使用更少的内存。例如,您可以先输出{"data":[
来开始json,然后输出json_encode编码的每一行,但用逗号分隔。最后,使用]}
现在您已将json放在一个文件中,您可以rewind开头,并使用fpassthru将其作为回复发送。
这样,您可以处理任意大的响应,因为您永远不需要将整个事物保存在内存中。
处理如此庞大的JSON文件完全是另一回事:)
答案 2 :(得分:0)
这里有一些伪代码:
while (there are rows to get) {
rows = get the next 1000 rows
write down the rows
}
适用于任何语言,只需改编id:D
答案 3 :(得分:0)
感谢所有在这里度过时间的人,现在我的问题的一部分已经解决了。所以我认为解决方案必须在这里,通过这个解决方案,您可以一次性以json的形式获取(或显示到浏览器中) 1 lac到15 lac行。
$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 '[]';
}
现在尝试解决第二部分,“如何在.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 '[]';
}
感谢所有人给出正确的指示,特别感谢Paul Dixon。