現在、一定のエリアをスキャンする複数のレーダー装置があり、スキャン後は約 140 万 ポイント (各ポイントに 4 つの属性が含まれる) のデータが返されます。
次に、レーダー デバイスはデータを ,
で区切られた文字列に結合します: "x1,y1,a1,p1,x2,y2,a2,p2....x1400000, y1400000,a1400000,p1400000"
この文字列のサイズは、100 メガバイト未満の数十メガバイトである必要があります。
PHP コードは次のように処理されます:
メモリ消費量についてはあまり詳しくなく、これほど大量のデータを処理するのは初めてです。
レーダーから送信されるデータが 11W 個の点群のみの場合(3MB のデータ)、ここで正常に受信して処理できます
データが少し大きい場合は、プロンプトが表示されますメモリ制限は 128M
確認しましたインターネット上のいくつかのメソッドは、ほとんどが変更と呼ばれるものですphp.ini
ファイル内memory_limit=-1
しかし、変更後も送信できません
現在、Radar との話し合いでは、毎回最大 10W ポイントをグループ化し、さらにパラメータを 1 つ追加する この送信に残っているポイント数
を私に送信できるということです。 PHPがそれを受け取ると戻り値として渡され、折り返し電話して送信し続けますが、このように計算してみると、1セットのデータを送るのに合計14~15回の送信が必要となります。 ..実現可能性はまだ確実ではありません
開発中にこの問題に遭遇した際にどのように対処したか教えていただけますか?
オンラインで待機しています。 。 。
リーリー
質問: gzip は有効ですか? この種の純粋な JSON データは、有効化後の圧縮率が高くなります。メモリ制限を変更した後、ネットワーク接続がタイムアウトになる場合もあります。
Webサーバーが受信するボディには長さ制限があり、nginx-client_max_body_size
ウェブモードではバッチ送信の方が良いソリューションです
より良い方法は、Webモードでのさまざまな制限がなく、より効率的なソケットバイナリ送信を使用することです
まず第一に、文字列を配列に変換すると、大量のメモリが消費されます。
必要に応じて、最後のステップは、それを json に変換してファイルに保存することです。Json も文字列なので、文字列として直接処理してみてはいかがでしょうか。
php7の場合、preg_replaceを使用できないため、それを処理するにはpreg_replace_callbackに切り替える必要があります
リーリーメモリ制限を拡大し、投稿のデータ量を増やします。 。基本的には数百MB程度なら問題ありません