我正在使用GeoDjango + PostGIS开发空间排名应用程序。基本上它的作用是它检索查询边界框内的所有几何,使用我创建的自定义函数计算相似性得分,然后返回具有最高分数的形状。
目前,每个查询的往返时间非常慢。运行探查器显示瓶颈来自threadsafe.py
,它由我的相似性函数内的GEOSGeometry
操作(即交叉,联合,包含等)调用。以下是单个查询中的示例profiler result。看起来GEOSGeometry
的线程安全特性是导致性能问题的原因。单独地,40ms的操作看起来并不是什么大不了的事,但是因为要与查询进行比较的形状数量通常很大,即〜1000个形状,40ms的操作总计达40秒。
因此,我的问题是如何优化功能以最大限度地缩短周转时间。我的一些初步想法是:
GEOSGeometry
的安全检查,因为这些对象是暂时的,不会与任何其他线程共享。如果可能的话,这将是理想的情况,因为现在花费的大部分时间都在threadsafe.py
你的想法是什么?
答案 0 :(得分:1)
我们切换到使用shapely进行地理操作。它让我们解决了线程安全问题。
仅供参考,匀称使用long,lat而不是lat,就像GeoDjango一样
答案 1 :(得分:0)
实际上,threadsafe.py
只是将每个调用包装到底层的C函数中。为了更好地了解您的瓶颈,请查看cumtime
列。有关列的说明,请参见此处:http://docs.python.org/library/profile.html#module-pstats。