PHP gère le problème de limite de mémoire des données extrêmement longues
迷茫
迷茫 2017-05-27 17:42:31
0
5
862

Il existe actuellement plusieurs appareils radar qui scannent une certaine zone. Après la numérisation, des données d'environ 1,4 million points (chaque point contient 4 attributs) seront renvoyées.
Ensuite, l'équipement radar divise les données en , 分隔的字符串:"x1,y1,a1,p1,x2,y2,a2,p2......x1400000,y1400000,a1400000,p1400000"
La taille de cette chaîne doit être de plusieurs dizaines de mégaoctets, soit moins de 100 mégaoctets.
Le code PHP est traité comme ceci :

$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;

Je ne connais pas grand-chose à la consommation de mémoire, et c'est la première fois que je traite une si grande quantité de données
Lorsque les données transmises par le radar ne représentent que 11Wpoints de groupe (environ 3 Modonnées), je peux recevez-le et traitez-le avec succès
Quand une fois que les données sont un peu plus volumineuses, il vous demande La limite de mémoire est de 128 Mo
J'ai vérifié certaines méthodes sur Internet, la plupart d'entre elles consistent à modifier le memory_limit=-1php.ini. code>php.ini文件中memory_limit=-1
可是改了之后仍然无法传输
目前跟雷达端商量的是他每次最多给我传10W组点,然后再多个一个参数本次传输还剩多少点Mais après l'avoir modifié, il ne peut toujours pas être transmis
Actuellement, la discussion avec le terminal radar est qu'il peut m'envoyer un maximum de
10W

points de groupe chacun temps, puis ajoutez un autre paramètre Combien de points reste-t-il dans cette transmission ?, une fois que PHP l'aura reçu, il lui sera donné comme valeur de retour, et il rappellera et continuera à l'envoyer pour moi, cependant, calculé de cette façon, il faudra au total 14 à 15 transmissions pour envoyer un ensemble de données... et la faisabilité n'est pas encore certaine 🎜 Chers amis, comment gérer ce genre de problème pendant. développement? 🎜En attente en ligne. . . 🎜
迷茫
迷茫

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

répondre à tous(5)
Ty80
ini_set('memory_limit', '500M'); //内存限制
set_time_limit(0); //执行超时,0代表无限等待
phpcn_u1582

Question : Gzip est-il activé ? Ce type de données JSON pures a un taux de compression élevé après son activation. Après avoir modifié la limite de mémoire, la connexion réseau peut également expirer.

滿天的星座
  1. Le serveur Web a une limite de longueur pour recevoir le corps s'il est trop long, il ne peut pas être accepté, comme nginx-client_max_body_size

  2. .
  3. La transmission par lots est une meilleure solution en mode web

  4. Une meilleure façon est d'utiliser la transmission binaire socket, qui n'a pas diverses restrictions en mode Web et est plus efficace

仅有的幸福

Tout d’abord, votre chaîne occupe beaucoup de mémoire. Si vous la convertissez en tableau, elle occupera beaucoup de mémoire.

En fonction de vos besoins, la dernière étape consiste à le convertir en json et à l'enregistrer dans un fichier. Json est également une chaîne, alors pourquoi ne pas la traiter directement sous forme de chaîne.

S'il s'agit de php7, preg_replace ne peut pas être utilisé et doit être remplacé par 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);
伊谢尔伦

Augmentez simplement la limite de mémoire et le volume des données de publication. . En gros, il n'y a aucun problème pour traiter quelques centaines de mégabits

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal