マップ内のポイントを含む配列を調べて、それらの距離を確認する必要があります。それぞれのノードから 200m と 50m 以内にあるノードの数を数える必要があります。値が小さい場合は問題なく機能します。しかし、さらに多くの値 (スケーラビリティ テストでは約 4000) を実行しようとすると、最大実行時間の 300 秒に達したというエラーが発生します。できれば300秒以内にこれだけ処理できる必要があります。
私は周りを読んで、この制限を無効/変更する方法があることを知りましたが、実行にかかる時間を短縮するために次のコードを実行する簡単な方法があるかどうか知りたいです.
for($i=0;$i<=count($data)-1;$i++)
{
$amount200a=0;
$amount200p=0;
$amount50a=0;
$amount50p=0;
$distance;
for($_i=0;$_i<=count($data)-1;$_i++)
{
$distance=0;
if($data[$i][0]===$data[$_i][0])
{
}
else
{
//echo "Comparing ".$data[$i][0]." and ".$data[$_i][0]." ";
$lat_a = $data[$i][1] * PI()/180;
$lat_b = $data[$_i][1] * PI()/180;
$long_a = $data[$i][2] * PI()/180;
$long_b = $data[$_i][2] * PI()/180;
$distance =
acos(
sin($lat_a ) * sin($lat_b) +
cos($lat_a) * cos($lat_b) * cos($long_b - $long_a)
) * 6371;
$distance*=1000;
if ($distance<=50)
{
$amount50a++;
$amount200a++;
}
else if ($distance<=200)
{
$amount200a++;
}
}
}
$amount200p=100*number_format($amount200a/count($data),2,'.','');
$amount50p=100*number_format($amount50a/count($data),2,'.','');
/*
$dist[$i][0]=$data[$i][0];
$dist[$i][1]=$amount200a;
$dist[$i][2]=$amount200p;
$dist[$i][3]=$amount50a;
$dist[$i][4]=$amount50p;
//*/
$dist.=$data[$i][0]."&&".$amount200a."&&".$amount200p."&&".$amount50a."&&".$amount50p."%%";
}
インデックス 0 には各ノードの一意の ID が含まれ、インデックス 1 には各ノードの緯度が含まれ、インデックス 2 には各ノードの経度が含まれます。
エラーは、最初のループ内の 2 番目の for ループで発生します。このループは、選択したマップ ノードを他のノードと比較するループです。私もハーバーシンフォーミュラを使っています。