在 php 中从服务器获取 json 数据时允许的 1073741824 字节内存耗尽(尝试分配 80 字节)
Allowed memory size of 1073741824 bytes exhausted (tried to allocate 80 bytes) while fetching json data from server in php
我正在尝试从服务器以 [=25=] 格式从数据库中获取大约 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);
我花了 1 天时间尝试了将近 100 种解决方案,但没有成功,我也知道这已发布多次,但我认为我的问题有点不同。请提出您宝贵的建议,我们将不胜感激。
无论您尝试在客户端对 50 万条记录执行什么操作,请尝试在服务器端执行。如果你只是需要显示它们,你可以考虑分页。获取类似于前 1000 条记录(例如 LIMIT 1000)的内容,让用户浏览其余的内容。
这里有一些伪代码供您使用:
while (there are rows to get) {
rows = get the next 1000 rows
write down the rows
}
它适用于任何语言,只需调整 id :D
如果您在从数据库中读取行时将 JSON 直接输出到文件,则使用的内存会少得多。例如,您可以先输出 {"data":[
以开始 json,然后输出由 json_encode 编码的每一行,但用逗号分隔。最后,用 ]}
关闭 JSON
现在您的 json 已保存在文件中,您可以 rewind to the start, and use fpassthru 将其作为回复发送。
这样,您就可以处理任意大的响应,因为您永远不需要将整个响应都保存在内存中。
处理如此大的 JSON 文件完全是另一回事:)
感谢所有花时间在这里的人,现在我的一部分问题解决了。所以我认为解决方案必须在这里,通过这个解决方案,您可以一次获取(或显示到浏览器中)1 lac 到 15 lac 行 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 '[]';
}
现在尝试解决第二部分,“如何将所有 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
我正在尝试从服务器以 [=25=] 格式从数据库中获取大约 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);
我花了 1 天时间尝试了将近 100 种解决方案,但没有成功,我也知道这已发布多次,但我认为我的问题有点不同。请提出您宝贵的建议,我们将不胜感激。
无论您尝试在客户端对 50 万条记录执行什么操作,请尝试在服务器端执行。如果你只是需要显示它们,你可以考虑分页。获取类似于前 1000 条记录(例如 LIMIT 1000)的内容,让用户浏览其余的内容。
这里有一些伪代码供您使用:
while (there are rows to get) {
rows = get the next 1000 rows
write down the rows
}
它适用于任何语言,只需调整 id :D
如果您在从数据库中读取行时将 JSON 直接输出到文件,则使用的内存会少得多。例如,您可以先输出 {"data":[
以开始 json,然后输出由 json_encode 编码的每一行,但用逗号分隔。最后,用 ]}
现在您的 json 已保存在文件中,您可以 rewind to the start, and use fpassthru 将其作为回复发送。
这样,您就可以处理任意大的响应,因为您永远不需要将整个响应都保存在内存中。
处理如此大的 JSON 文件完全是另一回事:)
感谢所有花时间在这里的人,现在我的一部分问题解决了。所以我认为解决方案必须在这里,通过这个解决方案,您可以一次获取(或显示到浏览器中)1 lac 到 15 lac 行 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 '[]';
}
现在尝试解决第二部分,“如何将所有 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