我正在使用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