我正在从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")));
答案 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 查找函数getOctantContainingPoint(...)。
我使用此代码作为实现我的基础,并且可以大大加快计算索引的方式(使用SIMD指令......)。
您还关注内存消耗。为了减少内存消耗,在下降过程中重新计算节点的边界框可以更快更轻。