GeoDjango:加速GEOS的几何操作

时间:2011-07-05 16:20:48

标签: django optimization thread-safety geodjango geos

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

目前,每个查询的往返时间非常慢。运行探查器显示瓶颈来自threadsafe.py,它由我的相似性函数内的GEOSGeometry操作(即交叉,联合,包含等)调用。以下是单个查询中的示例profiler result。看起来GEOSGeometry的线程安全特性是导致性能问题的原因。单独地,40ms的操作看起来并不是什么大不了的事,但是因为要与查询进行比较的形状数量通常很大,即〜1000个形状,40ms的操作总计达40秒。

因此,我的问题是如何优化功能以最大限度地缩短周转时间。我的一些初步想法是:

  1. 关闭/避免GEOSGeometry的安全检查,因为这些对象是暂时的,不会与任何其他线程共享。如果可能的话,这将是理想的情况,因为现在花费的大部分时间都在threadsafe.py
  2. 使用另一个不受控制的几何API。
  3. 在PostGIS级别而不是对象级别执行空间操作。这将使代码看起来很丑陋。更新:此选项不起作用。仅SQL查询的开销使操作更慢。)
  4. 你的想法是什么?

2 个答案:

答案 0 :(得分:1)

我们切换到使用shapely进行地理操作。它让我们解决了线程安全问题。

仅供参考,匀称使用long,lat而不是lat,就像GeoDjango一样

答案 1 :(得分:0)

实际上,threadsafe.py只是将每个调用包装到底层的C函数中。为了更好地了解您的瓶颈,请查看cumtime列。有关列的说明,请参见此处:http://docs.python.org/library/profile.html#module-pstats