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.
有什么方法可以设置 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.