我正在使用 GeoDjango + PostGIS 开发空间排名应用程序。基本上它的作用是检索查询边界框中的所有几何图形,使用我创建的自定义函数计算相似度得分,然后返回得分最高的形状。
目前,每个查询的往返时间非常慢。运行分析器显示瓶颈是由我的相似函数内部threadsafe.py
的GEOSGeometry
操作(即相交、联合、包含等)调用的。这是来自单个查询的示例分析器结果。看起来线程安全的性质GEOSGeometry
是导致性能问题的原因。单独来说,耗时 40 毫秒的操作似乎没什么大不了的,但因为要与查询进行比较的形状数量通常很大,即约 1000 个形状,所以 40 毫秒的操作加起来需要 40 秒。
因此,我的问题是如何优化功能以最小化周转时间。我最初的一些想法是:
- 关闭/避免 的安全性检查
GEOSGeometry
,因为这些对象是瞬态的,不与任何其他线程共享。如果可能的话,这将是理想的情况,因为现在花费的大部分时间都在threadsafe.py
- 使用另一个不安全的几何 API。
在 PostGIS 级别而不是对象级别执行空间操作。不过,这会使代码看起来很难看。(更新:此选项不起作用。仅 SQL 查询的开销会使操作变得更慢。)
你有什么想法?