最近邻居搜索1到2百万个移动物体

时间:2015-11-24 12:56:13

标签: redis collision-detection geospatial nearest-neighbor octree

应用程序将定期接收具有纬度和经度的大量移动物体(大约每秒100,000 [100万])。 要求是检测400米范围内的任何物体,检测必须在400毫秒(毫秒)内完成。

因此,每当应用程序接收到具有经度和经度的任何新对象时,我首先需要将其添加到数据结构中, 检查数据结构中的任何其他对象是否在400毫秒内与新添加的对象相距400米。

根据我的研究,我有以下两种选择: 选项1:如果对象数量较少,则可以将Redis GEO用于上述要求。但是,对于执行geoadd和georadius查询的100万个对象将花费超过400毫秒这是不可接受的。将来,对象可以是每秒2百万。

选项2:使用八叉树数据结构可以提供更好的性能我认为它的性能也会降低(需要的时间超过400毫秒) 用新对象更新八叉树时搜索100万个对象,并搜索新对象附近的对象。

我想了很多关于使用geohash对数据进行分区的方法。示例使用geohash的前缀并将数据保存在redis实例1和redis实例2中的其他geohas数据中。但是对于两个对象在400 m范围内但在相邻象限中的角落情况,它将失败。

问题 有没有人知道根据纬度和经度划分数据并仍然检测邻近的对象?或者减少map-reduce范例中的问题?

考虑到将来物体每秒可以达到200万次,任何人都能提出不同的方法吗?

1 个答案:

答案 0 :(得分:0)

两点:

1)对于分区,您可以让象限重叠,这意味着象限边界400米范围内的所有点都会添加两个象限。我认为这应该允许有用的分区。

2)移动对象的专用索引可能比四叉树好,例如MX-CIF-Quadtree。您也可以尝试我自己的PH树(Java sources)。它可以很好地适应大型数据集(最好使用至少10 ^ 6个点)并具有良好的更新性能。它实际上最适合群集数据。它基本上是一个前缀共享的四叉树,有许多优化(例如,它永远不需要重新平衡))。在3.5GHz的i7 3770K上,我可以插入每秒500K到1M点之间的树,最大可达100M(我在那时停止测试,但树应该可以轻松扩展到更大的数据集)。