GeoDjango:加速GEOS&x27;s几何运算

GeoDjango:加速GEOS&x27;s几何运算,django,optimization,thread-safety,geodjango,geos,Django,Optimization,Thread Safety,Geodjango,Geos,我正在使用GeoDjango+PostGIS开发一个空间排名应用程序。基本上,它所做的是检索查询边界框内的所有几何图形,使用我创建的自定义函数计算相似性分数,然后返回分数最高的形状 目前,每个查询中的往返时间非常慢。运行探查器显示瓶颈来自于我的相似性函数中的GEOSGeometry操作(即相交、并集、包含等)调用的threadsafe.py。下面是来自单个查询的示例。似乎是GEOSGeometry的线程安全特性导致了这里的性能问题。就个人而言,40毫秒的操作似乎不是什么大问题,但由于要与查询进行

我正在使用GeoDjango+PostGIS开发一个空间排名应用程序。基本上,它所做的是检索查询边界框内的所有几何图形,使用我创建的自定义函数计算相似性分数,然后返回分数最高的形状

目前,每个查询中的往返时间非常慢。运行探查器显示瓶颈来自于我的相似性函数中的
GEOSGeometry
操作(即相交、并集、包含等)调用的
threadsafe.py
。下面是来自单个查询的示例。似乎是
GEOSGeometry
的线程安全特性导致了这里的性能问题。就个人而言,40毫秒的操作似乎不是什么大问题,但由于要与查询进行比较的形状数量通常很大,即大约1000个形状,因此40毫秒的操作加起来需要40秒

因此,我的问题是如何优化函数以最小化周转时间。我最初的一些想法是:

  • 关闭/避免对
    GEOSGeometry
    进行数据安全检查,因为这些对象是瞬态的,不会共享给任何其他线程。如果可能的话,这将是理想的情况,因为现在花费的大部分时间都在
    threadsafe.py
  • 使用另一个不安全的几何体API
  • 在PostGIS级别而不是对象级别执行空间操作。这会使代码看起来很难看。(更新:此选项不起作用。仅SQL查询的开销就使得操作更加缓慢。)

  • 您的想法是什么?

    实际上,
    threadsafe.py
    只是包装了对底层C函数的每个调用。要更好地了解瓶颈是什么,请查看
    cumtime
    列。有关列的说明,请参见此处:。

    我们切换到使用geos操作。它让我们绕过了线程安全问题


    仅供参考,shapely使用long、lat和not lat,long就像GeoDjango那样

    你说得对,
    threadsafe.py
    是C函数的包装器。我已经仔细检查了分析结果,但是
    threadsafe.py
    仍然是瓶颈。我的意思是,每次调用空间操作(例如,相交、内、并集)时都会调用它。与threadsafe相比,这些操作实际花费的时间非常少。这就是为什么我在想,如果我能完全避免使用螺纹安全,问题就会解决。我尝试使用GeoJango附带的
    GDALGeometry
    ,作为
    GeoGeometry
    的替代品
    GDALGeometry
    原来依赖于threadsafe.py,因此性能更差。由于shapely的空间操作依赖于GEOS,我认为它也会遇到同样的问题。有趣。我试试看。