4

私は地理位置情報アプリに取り組んでいます。このアプリは、適切にインデックス化された MongoDB に約 500K のレコードを保持します。各行には、独自の緯度と経度の記録値があります。したがって、クライアントは、これらの 500k 行から 200 の最も近いポイントを回復する必要があります。パフォーマンスが気になります。最初は、すべてのレコード (lat/lng 情報) をキャッシュ マネージャーまたはインメモリ データベースに保持することを考えていました。その後、特定のポイント (lat/lng) をキャッシュ内の値と比較できます。この瞬間、私の疑問が生じます。

これらすべてのレコードをキャッシュ マネージャーの ArrayList に格納し、距離を計算するために、レコードのジオロケーションを ArrayList のジオロケーションと比較するとよいでしょうか?

そのアプローチでは、MongoDB で膨大な数のクエリが発生するのを防ぎます。一方、ArrayList に約 500K のレコード (地理位置情報) を保持し、リストをフェッチして最も近い 200 件を取得することで、間違っている可能性があります。間違っていなければ、少なくともパフォーマンスの低下だと思います。

どうすればその問題に対処できますか?

前もって感謝します。

4

1 に答える 1

4

データをメモリ内に保持すると、パフォーマンスが向上する可能性があります。しかし、ArrayList に 500k のレコードがあり、特定のポイントに最も近い 200 を検索したい場合、これは、500k のレコードのすべてを 1 つのリクエストごとにチェックする必要があることを意味します。これにはしばらく時間がかかります。おそらく、MongoDB にかかる時間よりもはるかに長くなります。

しかし、MongoDB が地理インデックスで行っているのと同じことを行うことで、パフォーマンスを向上させることができます。つまり、検索用に最適化された、よりスマートなデータ構造を使用します。たとえば、R -Tree 。バランスの取れた R ツリーでは、特定の領域内のすべてのレコードを検索することは、配列リストではlog nなく実行時の複雑さを伴う操作です。n500k エントリの場合、数桁の改善になります。

于 2013-11-06T19:33:42.070 に答える