在c++中管理带有属性的大型空间数据集



我有一个大约有70万个条目的数据集,每个条目是一组带有名称、时间戳、ID等属性的3D坐标。

现在我只是读取坐标并将它们渲染为OpenGL中的点。但是,我希望将每个点与其相应的属性关联起来,并且希望能够在运行时根据它们的属性对它们进行排序和选择。我该如何有效地实现这个目标呢?

我知道我可以把我可以把数据放在一个结构体和使用stl排序排序,但这是一个很好的设计选择,还是有一个更有效/优雅的方式来处理这个问题?

我倾向于看这些设计选择的方式是首先使用一个标准库容器(顺便说一句,如果你需要"只是"做查找,你不一定要排序,但你需要一个允许查找的容器),然后检查这是否是一个"足够有效"的解决方案。

你通常可以想出一个更有效、更优雅的自定义解决方案,但你往往会遇到两个问题:

1)你最终不得不实现某种类型的容器,这将花费你的时间在实现和调试相比,一个很好的理解和测试的容器已经存在。大多数时候,你最好解决手头的问题,而不是通过添加更多的代码使问题变得更大。

2)如果其他人在某些时候必须维护您的代码,那么他们很可能从设计和实现的角度熟悉标准库组件,但他们不会熟悉您的自定义容器,从而增加了学习曲线。

如果您将点类的每个属性视为向量的一个组件,那么您的选择过程就是一个区域查询。您的字符串属性等于某物的示例意味着该区域实际上是数据空间中的一行。但是,不会对该选择中的其他属性进行任何排序,您必须自己实现它,但是对于八叉树来说应该相对简单,它将数据划分在有序区域中。

如另一个答案所主张的,先尝试现有的标准解决方案。如果你能找到其中一个数据结构的现成实现:

  • r - tree
  • KD树
  • BSP
  • 八叉树,或者更可能是四叉树或八叉树原理的n维版本(我将在这里使用术语八叉树来表示一般数据结构)

那就去做吧。以下是我为空间数据管理推荐的数据结构。

您也可以使用能够处理空间数据的嵌入式RDBMS(它们通常实现R-tree用于空间索引),但如果您的数据集不是动态的,那么它可能不有趣。

如果你的数据集在10000个条目范围内,那么按照今天的标准,它不是那么大,所以使用更简单的结构应该足够了。在这个范围内,我将首先使用简单的std::vector,然后使用std::sortstd::find过滤较小集合中的数据,然后对其进行排序。

我可能会在第二次尝试中尝试对查询最多的属性进行有序集或映射,然后进行一些基准测试以选择性能更好的解决方案。

对于一个更有效的一维索引算法(本质上,这就是集合和映射),你可能想尝试B-trees:在google上有c++实现。

我的第三次尝试将走向OpenCL解决方案(尽管如果你正在做大量的OpenGL渲染,你可能更喜欢在CPU上做工作,但这取决于你的帧率需求)。

如果您的数据集更大,那么考虑我最初列出的更复杂的解决方案之一。

无论如何,如果没有更多关于你的数据集的细节以及你计划如何使用它,将很难提供一个好的解决方案,所以我们能给出的唯一真正的建议是:尝试你能做的一切并进行基准测试。

如果您正在处理点云,请查看PCL,它可以为您节省大量时间和精力,而无需自己深入研究空间索引的复杂性。它还包括可视化

最新更新