八月:我做错了吗?插入速度非常慢

时间:2016-03-18 13:16:09

标签: c++ memory-management octree

我正在从10点到10亿点之间的任何地方写入一个基于八进制的容器到内存中。由于加载了大量数据,我需要注意内存消耗。

一切似乎都正常工作并根据需要进行细分,但插入时间非常慢。可能是因为父母与子女之间的数据重新分配。 有什么我可以做的来优化这个吗?我是否正确实施了这个? 我可以在每个节点中保留向量以包含最大点数,但这会大大增加所需的内存。

使用简单的R树型容器,我在大约48秒内加载了4.68亿个点。 使用下面的八叉树,我在245秒内加载。

String address = "192.168.232.189";

// "C0A8E8BD"
String result = String.Concat(address.Split('.').Select(x => int.Parse(x).ToString("X2")));

2 个答案:

答案 0 :(得分:1)

只是一件小事,但取而代之的是:

Children.push_back(OctreeNodePtr(new OctreeNode(BoundingBox::From(box[0], center))));

用这个:

Children.push_back(std::make_shared<OctreeNode>(BoundingBox::From(box[0], center)));

会减少一点加载时间并减少内存消耗。

任何shared_ptr都是如此。 make_shared&lt;&gt; route将控制块与共享对象合并。

答案 1 :(得分:0)

我在这里看到的是,为了插入点,你遍历8个孩子并检查每个孩子是否在里面。

八叉树的主要优点是,根据边界框中心和数据的位置,您可以计算索引而无需迭代您的孩子。这称为八分圆(八叉树)。

你可以在这里找到一个简单的实现。 https://github.com/brandonpelfrey/SimpleOctree/blob/master/Octree.h#L79 查找函数getOc​​tantContainingPoint(...)。

我使用此代码作为实现我的基础,并且可以大大加快计算索引的方式(使用SIMD指令......)。

您还关注内存消耗。为了减少内存消耗,在下降过程中重新计算节点的边界框可以更快更轻。