PHP處理超長資料記憶體限制問題
迷茫
迷茫 2017-05-27 17:42:31
0
5
842

目前存在多台雷達設備,對一定區域範圍進行掃描,掃描後將傳回約140萬個點(每個點包含4個屬性)的資料。
然後雷達設備將資料拼接成以, 分隔的字串:"x1,y1,a1,p1,x2,y2,a2,p2......x1400000, y1400000,a1400000,p1400000"
這個字串大小應該有幾十兆、不到100兆吧。
PHP程式碼是這樣處理的:

$num=$_POST['num'];//点的总数量
$str=$_POST['str'];//点的4个属性组成的字符串
$str_arr=expload(',',$str);//将字符串转换为数组

//将数组转换成json字符串
$point=array();
for($n=1;$n<=$num;$n++){
    $x=$str_arr[$n*4-4];
    $y=$str_arr[$n*4-3];
    $a=$str_arr[$n*4-2];
    $p=$str_arr[$n*4-1];
    $point[]=array("x"=>$x,"y"=>$y,"a"=>$a,"$p"=>$p);
}
$json_str=json_encode($point);

//将json字符串保存在".txt"文件中
$handle=fopen("./1.txt","w");
fwrite($handle, $json_str);
fclose($handle);

//返回请求成功信息
echo "ask=1&cmd=3";
exit;

對於記憶體消耗我不太懂,也是第一次處理這麼大的資料
當雷達傳輸的資料只有11W組點(約3MB資料)時,我這邊才能順利接收並且進行處理
當資料再大一點之後就提示內存限制128M
我自己去網上查了一些方法,大部分都是叫改php.ini檔案中memory_limit=-1
可是改了之後仍然無法傳輸
目前跟雷達端商量的是他每次最多給我傳 10W組點,然後再多個一個參數本次傳輸還剩多少點,PHP接收到後作為返回值給他,他再回調繼續給我發,但是這樣算下來,總共要進行14~15次傳輸才能發完一組資料...而且可行性還不確定
請問各位大大,你們在開發中遇到這種問題是怎麼處理的?
在線等。 。 。

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回覆(5)
Ty80

雷雷

phpcn_u1582

題主 gzip 開啟了沒? 這種純 JSON 數據,開啟了以後壓縮率很高的。改大了記憶體限制以後,網路連線也可能會逾時的。

滿天的星座
  1. web伺服器接收Body有長度限制,超長不能接收, 例如nginx-client_max_body_size

  2. web模式下採用分批傳輸是比較好的方案

  3. 更好的方式是用socket二進位傳輸, 沒有web模式下的各種限制, 效率較高

仅有的幸福

首先你這字串佔用記憶體就很大了,你再轉換為陣列處理佔用記憶體會非常大的。

看你的需求,最後是轉換為json存到文件,json也是字串,為何不直接字串處理呢。

如果php7的話不能使用preg_replace,就需要換成preg_replace_callback來處理

$str=$_POST['str'];//点的4个属性组成的字符串
$json_str = '['.substr(preg_replace('/([^,]+),([^,]+),([^,]+),([^,]+),/iU','{"x":"","y":"","a":"","p":""},',$str.','),0,-1).']';
//将json字符串保存在```.txt```文件中
$handle=fopen("./1.txt","w");
fwrite($handle, $json_str);
fclose($handle);
伊谢尔伦

記憶體限制開大,還有post的資料量也開大就可以了。 。基本上幾百兆處理起來是沒問題的

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板