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

时间:2015-03-29 20:57:18

标签: c++ boost

有没有办法设置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);

1 个答案:

答案 0 :(得分:0)

没有这种方式(便携)。

前提也是错误的:

  

例如,我有64GB的内存,我创建了一个20GB的文件。这全部加载到内存

错误:它只会加载使用的网页。是的,这可能意味着你可能最终拥有20GB的内存。只要没有其他进程需要物理内存来执行其他任务,操作系统就可以自由地执行此操作。

对于操作系统来说,任意原因任意取消映射数据都是愚蠢的。您希望操作系统利用可用内存。否则,那些硅芯片上的钱被浪费了。

  

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

在没有自定义分配器的情况下使用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!在所有支持它的系统上(我知道没有主流操作系统没有),文件被创建稀疏