c++ - 内存映射文件是否为大缓冲区提供了优势?

标签 c++ c memory-management mmap large-data

我的程序处理需要存储在连续内存(几千兆字节)中的大型数据集。使用 std::allocator(即 mallocnew)分配内存会导致系统停顿,因为大部分虚拟内存被保留并且物理内存被填满上。

由于该程序一次只能在一小部分上工作,我的问题是使用内存映射文件是否会提供优势(即 mmap 或 Windows 等效文件。)这就是创建一个大的稀疏临时文件并将其映射到虚拟内存。或者是否有另一种技术可以改变系统的分页策略,以便一次将更少的页面加载到物理内存中。

我试图避免构建一次加载文件的多个部分的流机制,而是依赖于系统的 vm 分页。

最佳答案

是的,mmap 具有加快速度的潜力

需要考虑的事项:

  • 请记住 VMM 会以阻塞的页面大小(在 Linux 上为 4k)将内容分页进出
  • 如果您的内存访问随着时间的推移得到很好的本地化,那么这会很有效。但是,如果您对整个文件进行随机访问,您最终会(仍然)进行大量的搜索和颠簸。因此,请考虑您的“小部分”是否与文件的本地化部分相对应。
  • 对于大型分配,mallocfree 无论如何都会使用mmapMAP_ANON。因此,内存映射文件的不同之处在于,您让 VMM 为您执行 I/O。
  • 考虑将 madvisemmap 结合使用,以协助 VMM 进行良好的分页。
  • 当您使用openread(另外,正如erenon 所建议的那样,posix_fadvise),您的文件仍然保存在缓冲区中(即它不会立即写出)除非你也使用 O_DIRECT。因此,在这两种情况下,您都依赖内核进行 I/O 调度。

关于c++ - 内存映射文件是否为大缓冲区提供了优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27233564/

相关文章:

c - 如何在c中实现我自己的printf

c - 缓慢的系统调用和信号

c++ - 重载删除和检索大小?

c++ - 静态成员定义中的双 `template` 关键字

c++ - 使用 boost 来构建和访问稀疏矩阵中的值

c++ - 如何确定 boost::variant 变量是否为空?

C:结构,简单,完整的短程序代码显示

C++ 全局函数

c - 在 C 中读取执行程序标准输出的更好方法

c - 如何延迟分配归零内存?