Boost managed_mapped_file: 设置允许的最大内存使用量

Boost managed_mapped_file: setting maximum allowed memory usage

有什么方法可以设置 managed_mapped_file 使用的最大允许内存?例如,我有 64GB 的内存,我创建了一个 20GB 的文件。这全部加载到内存中。例如,有没有办法指定只使用 1GB 内存?甚至大约就足够了。

编辑:我应该添加我使用 boost::interprocess::vector.. 也许有专门化分配器的方法?

typedef bi::allocator<Node, bi::managed_mapped_file::segment_manager> allocator_node_t;
typedef bi::vector<Node, allocator_node_t> vector_node_t;

bi::managed_mapped_file* nodeFile = new bi::managed_mapped_file(bi::open_or_create, "nodes_m.bin", bigSize);
allocator_node_t alloc_n(nodeFile->get_segment_manager());
vector_node_t* nodes = nodeFile->find_or_construct<vector_node_t>("nodes")(alloc_n);

没有这种方式(便携)。

另外前提错误:

For example, I have 64GB of memory and I create a 20GB file. This is all loaded into memory

错误:它只会加载被使用的页面。是的,这可能意味着您最终可能会拥有完整的 20GB 内存。 OS 可以自由执行此操作,只要没有其他进程需要其他任务的物理内存。

OS 以任何理由任意取消映射该数据是愚蠢的。您希望 OS 利用可用内存。不然花在那些硅芯片上的钱。

EDIT: I should add I use boost::interprocess::vector.. maybe there is a way to specialize the allocator?

在没有自定义分配器的情况下使用 boost::interprocess::vector 首先不会使用共享内存。你需要使用例如boost::interprocess::allocator<T, boost::interprocess::managed_mapped_file::segment_manager> 首先使用映射文件。

不,分配器中的任何内容都不能覆盖 OS 虚拟内存调整参数。

无需专门化(在 C++ 的意义上)

bi::managed_mapped_file* nodeFile = new bi::managed_mapped_file(bi::open_or_create, "nodes_m.bin", bigSize);
allocator_node_t alloc_n(nodeFile->get_segment_manager());
vector_node_t* nodes = nodeFile->find_or_construct<vector_node_t>("nodes")(alloc_n);

第一次执行此代码(即创建 "nodes_m.bin")将 不会 加载 bigSize。事实上,它甚至不会在磁盘上分配 bigSize!在所有支持它的系统上(我知道没有主流 OS 不支持)文件被创建 sparse.