性能

有关各种查询方法的比较以及使用Rtree可以获得多少加速度,请参阅`tests / benchmarks.py`_文件。

有一些简单的事情可以提高性能。

使用流加载

通过允许对数据进行预排序,这将在很大程度上(在许多情况下为数量级)提高性能:py:meth:〜rtree.index.Index.insert

>>> def generator_function(somedata):
...    for i, obj in enumerate(somedata):
...        yield (i, (obj.xmin, obj.ymin, obj.xmax, obj.ymax), obj)
>>> r = index.Index(generator_function(somedata))

批量加载索引后,您可以使用以下命令将其他记录插入索引:py:meth:~rtree.index.Index.insert

重写 dumps 去使用最高的pickle协议

>>> import cPickle, rtree
>>> class FastRtree(rtree.Rtree):
...     def dumps(self, obj):
...         return cPickle.dumps(obj, -1)
>>> r = FastRtree()

使用对象='raw'

在任何 intersection()nearest() 或查询中,使用objects='raw'关键字参数::

>>> objs = r.intersection((xmin, ymin, xmax, ymax), objects="raw")

调整索引属性

调整 rtree.index.Property 适合你的索引。

  • 设置你的 leaf_capacity 高于默认值100。在许多情况下,默认页面大小4096可以使用1000+。

  • 增加 fill_factor 接近0.9。较小的填充因子意味着更多的拆分,这意味着更多的节点。根据您的使用情况,这可能是坏的或好的。

将维度限制为所需的数量

不要使用超过实际需要的尺寸。如果你只需要2个,只需要2个。否则,您将浪费大量的存储空间,并为索引的每个查询、搜索和插入操作添加更多的浮点比较。

使用正确的查询方法

如果你只需要一个计数,使用 count(),如果你只需要ID,使用 intersection() 。否则,可能会复制大量数据。