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

标签 c++ memory-mapped-files boost-interprocess boost-geometry r-tree

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

机械师已经按照取消映射文件,进行增长和重新映射的方式进行了整理-所有这些工作。

到目前为止,我们已经尝试过以坐标固有尺寸的10倍高估尺寸,这种方法可以正常工作,但是在使用du进行检查时被严重高估了。

有什么方法可以预测(最坏情况还是最精确的情况)在给定对象数量的情况下,我们要求映射文件增长多少大小?低估(例如系数为5)最终导致堆栈崩溃。

谢谢

最佳答案

从纯粹的意义上讲,这个问题与Boost-inteprocess无关。

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

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

当然,您将处于近似范围内,但是如果有足够的模拟运行,您应该会获得可用的信息。

作为最后的选择,Boost Geometry的来源/开发人员将是要问的人。

其他 Angular

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

相关示例:

  • Bad alloc is thrown

  • enter image description here

    这立即为您提供了一些使用思路:
  • shm.get_free_memory()获取段
  • 中剩余空间的原始数字
    在托管内存段之外使用rtree时,使用内存分析器(如Valgrind Massif)使用


  • 盒子外面:
  • 最后,不要忘记分配一个稀疏文件(甚至是10 GiB)并使用共享内存管理器分配到它中可能非常便宜:只有实际使用的页面才会被提交到磁盘,因此实际磁盘使用量将与实际所需的大小紧密匹配。

    备件文件是神奇的。
  • 关于c++ - 估计内存映射的boost rtree所需的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62339977/

    相关文章:

    c++ - boost::32 和 64 位进程之间的进程间共享内存

    c++ - 使用共享内存在 C++ 和 Python 之间进行快速通信

    c++ - 当 int 不是 int (intX_t)

    c++ - 没有标准库的通用容器

    c++ - 为什么字符串不会出现左操作数所需的错误左值?

    java - 使用 NIO,我需要关心 block 边界上的 R/W 吗?

    c# - 如何在内存映射文件中共享列表值

    c# - 如何从内存映射文件中获取int

    c++ - boost::interprocess::basic_string 作为 std::string

    c++ - 为什么这不是正确的生产者消费者模型,以及在我使用 STL 队列时导致错误的原因是什么?