2011-07-05 9 views
3

GeoDjango + PostGISを使用して空間ランキングアプリケーションを開発しています。基本的には、クエリバウンディングボックス内のすべてのジオメトリを取得し、作成したカスタム関数を使用して類似度スコアを計算し、一番上のスコアを持つシェイプを返します。GeoDjango:GEOSのジオメトリ操作の高速化

現在、各クエリの往復時間は非常に遅いです。ランニングプロファイラは、ボトルネックがであり、これは私の類似関数内で操作(すなわち、交差、結合、包含など)によって呼び出されることを示しています。 1つのクエリからの例profiler resultがあります。 GEOSGeometryというスレッドセーフな性質が、ここでパフォーマンスの問題を引き起こしているようです。個々には、40msを要する操作は大したことではないように見えるが、クエリと比較する形状の数が通常は〜1000の形状であるため、40msの操作で最大40秒が加算される。

したがって、私の質問は、どのようにターンアラウンドタイムを最小限に抑えるために関数を最適化できるかです。私の最初のアイデアのいくつかは以下のとおりです。これらのオブジェクトは一時的なものと、他のスレッドに共有されていないよう

    は、 GEOSGeometryのtheadsafetyチェックを避ける/オフに
  1. 。できるだけ多くの時間が費やされているので、これは理想的なケースです。threadsafe.py
  2. トレッドセーフではない別のジオメトリAPIを使用します。
  3. オブジェクトレベルではなく、PostGISレベルで空間操作を実行します。これによりコードは醜いものになります。 アップデート:。は、このオプションが機能しないだけではSQLクエリのオーバーヘッドがさらに遅く操作を行います。)

あなたの考えは何ですか?

+1

をして長いように、緯​​度、経度緯度ではなく使用しています。 'GDALGeometry'はthreadsafe.pyに依存することが判明し、結果としてさらに悪化しています。 – ejel

答えて

1

geos操作ではshapelyを使用しました。スレッドセーフな問題の周りに私たちがいました。

はFYI、すっきりGeoDjango私はGEOSGeometry` `の代替としてGeoDjangoが付属しています` GDALGeometry`を使用してみました

+0

GEOSの空間的な操作には滑らかに依存しているため、同じ問題が発生するはずです。面白い。私はそれを試してみましょう。 – ejel

+0

あなたはgeodjangoモデルで整形式を使用できましたか? – linqu

0

実際には、threadsafe.pyは、基礎となるC関数への各呼び出しをラッピングするだけです。ボトルネックが何であるかについては、cumtimeの列をご覧ください。列の説明は、http://docs.python.org/library/profile.html#module-pstatsを参照してください。

+0

'threadsafe.py'はC関数のラッパーです。プロファイリングされた結果を二重チェックしましたが、 'threadsafe.py'がボトルネックになっていることはまだあります。つまり、空間操作(たとえば、交差、内部、結合)が呼び出されるたびに呼び出されます。これらの操作で実際に費やされた時間は、スレッドセーフで費やされた時間に比べて非常に少ない時間です。そのため、スレッドセーフを使用することを避けることができれば、問題は解決されると思っていたのです。 – ejel

+0

プロファイラの結果を見ると、 – arghbleargh

関連する問題