我正在使用GeoDjango + PostGIS開發空間排名應用程序。基本上,它會檢索查詢邊界框內的所有幾何,使用我創建的自定義函數計算相似度分數,然後返回具有最高分數的形狀。GeoDjango:加速GEOS的幾何操作
目前每個查詢的往返時間都很慢。正在運行的分析器顯示瓶頸來自threadsafe.py
,在我的相似度函數內部被GEOSGeometry
操作(即相交,聯合,包含等)調用。以下是來自單個查詢的示例profiler result。看起來GEOSGeometry
的線程安全性質是造成性能問題的原因。單獨來說,40ms的操作看起來並不是什麼大問題,但是因爲與查詢比較的形狀數量通常很大,即〜1000個形狀,所以40ms的操作總計達40秒。
因此,我的問題是如何優化功能以最小化週轉時間。我的一些初步設想是:
- 關閉/避免
GEOSGeometry
的theadsafety檢查,因爲這些物體是短暫的,不共享任何其他線程。如果可能的話,這將是理想的情況,因爲現在花費的大部分時間在threadsafe.py
- 使用另一個幾何非API的幾何API。
-
在PostGIS級別而不是對象級別執行空間操作。這會使代碼看起來很醜陋。(更新:此選項不起作用單獨的SQL查詢的開銷,使操作更慢。)
什麼是你的想法?
我試着用'GDALGeometry'附帶GeoDjango內置作爲替代'GEOSGeometry'。 'GDALGeometry'原來依賴於threadsafe.py,結果執行得更糟。 – ejel