6

Nearest-n または boxed geo-query を実行するアプリ エンジン データストア用の代替ライブラリを探しています。現在、GeoModel 0.2 を使用しており、実行速度が非常に遅い (場合によっては 1.5 秒以上)。誰か提案はありますか?

ありがとう!

4

3 に答える 3

6

ジオモデルにも同じ問題があります。それを修正するために、解像度 4 を使用し、Python の並べ替えとフィルターを使用します。

SEARCHED_LOCATION = db.GeoPt("48.8566667, 2.3509871") # Location of Paris.
DISTANCE = 50000 #Between 10000 and 150000.
MAX_RESULTS = 300

# Resolution '4' is about 150 kilometers i suppose it's a good compromise.                                                                                                                            
bbox = geocell.compute_box(geocell.compute(SEARCHED_LOCATION, resolution=4))
cell = geocell.best_bbox_search_cells(bbox, geomodel.default_cost_function)

query.filter('location_geocells IN', cell)

# Python filters
def _func(x):
  """Private method used to set the distance of the model to the searched location
  and return this distance.
  """
  x.dist = geomath.distance(SEARCHED_LOCATION, x.location)
  return x.dist

results = sorted(query.fetch(MAX_RESULTS), key=_func) # Order the result by distance
results = [x for x in results if x.dist <= DISTANCE]  # Filter the result
于 2010-10-22T12:39:01.230 に答える
4

ジオモデル 0.2.0 リリースを使用する代わりに、withasync ブランチを使用します (

http://code.google.com/p/geomodel/source/browse/#svn/branches/withasync )。これにより、asynctools を使用してクエリを並行して実行できるようになり、多くのクエリで大幅に高速化されます。

app/pythonpath にも asynctools があることを確認してください。

于 2010-11-23T05:06:44.210 に答える
2

パフォーマンスが優れている既存のライブラリを紹介することはできませんが、思い出すと、GeoModel はオープン ソースであり、コードの理解は難しくありません。シナリオに合わせてコードを調整することで、速度を改善できることがわかりました。

たとえば、最も近い n が必要ない場合は、特定のバウンディング ボックスまたは半径内から X の結果が必要なだけです。GeoModel は現在、適切な geohash 内のすべてのレコードを取得してからソートする必要があるため、GeoModel の速度をおそらく向上させることができます。記憶の中で最も近い。(その実装の詳細は、読者の演習として残しておきます。)

使用しているジオハッシュのレベル数を調整することも検討してください。密度の高いデータが多く、小さな領域に対してクエリを実行している場合は、8 または 12 ではなく 16 レベルを維持することで、パフォーマンスが大幅に向上する可能性があります。

(私は今、GeoModel のソースを見ていませんが、数か月前に最後に使用したときのことを思い出しているので、これを一粒の塩で取り、自分でソース コードに飛び込んでください。)

于 2010-10-22T04:32:13.630 に答える