目前存在多台雷達設備,對一定區域範圍進行掃描,掃描後將傳回約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次傳輸才能發完一組資料...而且可行性還不確定
請問各位大大,你們在開發中遇到這種問題是怎麼處理的?
在線等。 。 。
雷雷
題主 gzip 開啟了沒? 這種純 JSON 數據,開啟了以後壓縮率很高的。改大了記憶體限制以後,網路連線也可能會逾時的。
web伺服器接收Body有長度限制,超長不能接收, 例如nginx-client_max_body_size
web模式下採用分批傳輸是比較好的方案
更好的方式是用socket二進位傳輸, 沒有web模式下的各種限制, 效率較高
首先你這字串佔用記憶體就很大了,你再轉換為陣列處理佔用記憶體會非常大的。
看你的需求,最後是轉換為json存到文件,json也是字串,為何不直接字串處理呢。
如果php7的話不能使用preg_replace,就需要換成preg_replace_callback來處理
記憶體限制開大,還有post的資料量也開大就可以了。 。基本上幾百兆處理起來是沒問題的