GeoDjango:加速GEOS&x27;s几何运算
我正在使用GeoDjango+PostGIS开发一个空间排名应用程序。基本上,它所做的是检索查询边界框内的所有几何图形,使用我创建的自定义函数计算相似性分数,然后返回分数最高的形状 目前,每个查询中的往返时间非常慢。运行探查器显示瓶颈来自于我的相似性函数中的GeoDjango:加速GEOS&x27;s几何运算,django,optimization,thread-safety,geodjango,geos,Django,Optimization,Thread Safety,Geodjango,Geos,我正在使用GeoDjango+PostGIS开发一个空间排名应用程序。基本上,它所做的是检索查询边界框内的所有几何图形,使用我创建的自定义函数计算相似性分数,然后返回分数最高的形状 目前,每个查询中的往返时间非常慢。运行探查器显示瓶颈来自于我的相似性函数中的GEOSGeometry操作(即相交、并集、包含等)调用的threadsafe.py。下面是来自单个查询的示例。似乎是GEOSGeometry的线程安全特性导致了这里的性能问题。就个人而言,40毫秒的操作似乎不是什么大问题,但由于要与查询进行
GEOSGeometry
操作(即相交、并集、包含等)调用的threadsafe.py
。下面是来自单个查询的示例。似乎是GEOSGeometry
的线程安全特性导致了这里的性能问题。就个人而言,40毫秒的操作似乎不是什么大问题,但由于要与查询进行比较的形状数量通常很大,即大约1000个形状,因此40毫秒的操作加起来需要40秒
因此,我的问题是如何优化函数以最小化周转时间。我最初的一些想法是:
GEOSGeometry
进行数据安全检查,因为这些对象是瞬态的,不会共享给任何其他线程。如果可能的话,这将是理想的情况,因为现在花费的大部分时间都在threadsafe.py
您的想法是什么?实际上,
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,我认为它也会遇到同样的问题。有趣。我试试看。