估计内存映射 boost rtree 所需的大小

Estimating size required for memory mapped boost rtree

我们有一个场景,我们动态增长一个内存映射文件,用于 boost 的 r-tree 几何索引。我们还利用了boost的进程间内存映射文件api's.

机制已经在取消映射文件、增长和重新映射方面得到解决 - 这一切都有效。

到目前为止,我们已经尝试过高估坐标固有大小的 10 倍的大小,这可行,但在使用 du 检查时被严重高估了。

是否有某种方法可以预测(最坏情况或精确)我们应该要求映射文件在给定对象数量的情况下增长到多大?低估,例如因子 5,最终会导致堆栈崩溃...

谢谢

从纯粹意义上讲,这个问题在很大程度上与 boost-interprocess 无关。

您想知道分配模式(不仅仅是净分配量,还有由于碎片化而导致的有效“池”使用。

您可以做的是对分配器使用情况进行统计(问得好:是否有某种统计信息收集分配器适配器?)并计算出来。

当然你会在近似范围内,但如果模拟运行足够多,你应该有可用的信息。

作为最后的手段,Boost Geometry 的 source/developers 将是人们要问的问题。

其他角度

关于 Boost Interprocess,我们不知道您使用的是什么。我假设 managed_mapped_file/managed_heap_memory/managed_external_buffer。请注意,当将它们与默认内存分配策略 (rbtree_best_fit) 一起使用时,可能会出现相当大的碎片或分配开销(对于基于节点的容器,可能包括 rtree)。

相关示例:

  • Bad alloc is thrown

这立即给你一些使用的想法:

  • shm.get_free_memory() 获取 space 的原始数字,剩余在段
  • 在托管内存段之外使用 rtree 时使用内存分析器(如 Valgrind Massif)

开箱即用:

  • 最后,不要忘记分配一个稀疏文件可能非常便宜,即使是 10 GiB,并且只使用共享内存管理器分配到该文件中:只有页面实际在使用将提交给磁盘,因此实际磁盘使用将与实际需要的大小非常匹配。

    稀疏文件很神奇。