有没有办法设置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);
答案 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
!在所有支持它的系统上(我知道没有主流操作系统没有),文件被创建稀疏。