使用C ++中的属性管理大型空间数据集

时间:2013-04-10 17:58:06

标签: c++ attributes point-clouds spatial-data

我有一个包含约700,000个条目的数据集,每个条目都是一组3D坐标,其中包含名称,时间戳,ID等属性。

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

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

3 个答案:

答案 0 :(得分:2)

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

您通常可以提出一种更高效,更优雅的自定义解决方案,但您可能会遇到两个问题:

1)您最终必须实现某种类型的容器,与已经熟悉且经过测试的容器相比,这将花费您在实现和调试方面的时间。大多数情况下,您最好尝试解决手头的问题,而不是通过添加更多代码来扩大问题。

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

答案 1 :(得分:0)

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

正如另一个答案所倡导的那样,首先尝试现有的标准解决方案。如果您可以找到其中一个数据结构的架构实现:

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

然后去吧。这些是我建议用于空间数据管理的数据结构。

您还可以使用能够处理空间数据的嵌入式RDBMS(它们通常实现用于空间索引的R树),但如果您的数据集不是动态的,则可能没有意义。

如果您的数据集属于10000个条目范围,那么按今天的标准来说,它并不是那么大,因此使用更简单的结构就足够了。在那个边界,我会先找一个简单的std::vector,然后使用std::sortstd::find过滤较小的数据集,然后对其进行排序。

我可能会在第二次尝试时在最常查询的属性上尝试有序集或映射,然后执行一些基准来选择性能更高的解决方案。

对于更有效的一维索引算法(实质上,这就是集合和映射是什么),您可能想尝试 B-trees :谷歌可以使用C ++实现。

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

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

无论如何,如果没有关于您的数据集的更多细节以及您计划如何使用它,将很难提供一个好的解决方案,因此我们唯一真正的建议是:尝试一下你可以和基准测试

答案 2 :(得分:0)

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