在php中从服务器获取json数据时,允许的内存大小为1073741824字节耗尽(试图分配80个字节)

时间:2015-11-04 10:49:53

标签: php postman

我试图以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个解决方案,但没有运气,我也知道这次发布很多次,但我认为我的问题有点不同。请提出宝贵的建议,我们将不胜感激。

4 个答案:

答案 0 :(得分:1)

无论您尝试在客户端使用50万条记录,请尝试在服务器上进行操作。如果您只需要显示它们,您可以考虑分页。获取类似前1000条记录的内容(例如LIMIT 1000),让用户浏览其余内容。

答案 1 :(得分:1)

如果在从数据库中读取行时将JSON直接输出到文件,它将使用更少的内存。例如,您可以先输出{"data":[来开始json,然后输出json_encode编码的每一行,但用逗号分隔。最后,使用]}

关闭JSON

现在您已将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。