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

tml*_*len 5 c c++ memory-management mmap large-data

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

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

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

abl*_*igh 5

是的,mmap可能加快速度.

需要考虑的事项:

  • 请记住,VMM会阻止页面大小的内容和页面大小(Linux上为4k)
  • 如果您的内存访问权限随着时间的推移而得到了很好 但是如果你对你的整个文件进行随机访问,你最终会进行大量的搜索和捶打(仍然).因此,请考虑您的"小部分"是否与文件的本地化位相对应.
  • 对于大型的分配,malloc并且free将使用mmapMAP_ANON反正.因此,映射文件的内存差异就在于您正在让VMM为您执行I/O操作.
  • 考虑使用madvisewith mmap来帮助VMM很好地进行分页.
  • 当你使用openread(加上,正如erenon建议的那样posix_fadvise)时,你的文件仍然保存在缓冲区中(即它不会被立即写出),除非你也使用O_DIRECT.因此,在这两种情况下,您都依赖内核进行I/O调度.