首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内存映射文件是否为大型缓冲区提供了优势?

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

Stack Overflow用户
提问于 2014-12-01 17:10:06
回答 3查看 1.4K关注 0票数 5

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

由于程序一次只能处理小部分,所以我的问题是,使用内存映射文件是否具有优势(即mmap或与Windows相当的文件)。这是创建一个大型稀疏临时文件并将其映射到虚拟内存。或者,是否有另一种技术可以改变系统的分页策略,使一次加载到物理内存中的页面更少。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-12-01 17:46:58

是的,mmap有可能加快速度。

需要考虑的事项:

  • 请记住,VMM会以阻塞的页面大小(在Linux上为4k)对内容进行分页。
  • 如果您的内存访问是很好的本地化,随着时间的推移,这将工作良好。但是如果你对你的整个文件进行随机访问,你最终会有很多的寻找和打击(仍然)。因此,请考虑您的“小部分”是否与文件的本地位相对应。
  • 对于大量的分配,mallocfree无论如何都会在MAP_ANON中使用mmap。因此,内存映射文件的区别很简单,就是让VMM为您做I/O。
  • 考虑使用madvisemmap来很好地帮助VMM分页。
  • 当您使用openread (如erenon建议的,posix_fadvise)时,您的文件仍然保存在缓冲区中(也就是说,它不会立即写入),除非您也使用了O_DIRECT。因此,在这两种情况下,您都依赖内核进行I/O调度。
票数 5
EN

Stack Overflow用户

发布于 2014-12-01 17:22:42

如果数据已经在文件中,它将加快速度,特别是在非顺序情况下。(在顺序情况下,read获胜)

如果使用openread,也可以考虑使用福格鲁

票数 3
EN

Stack Overflow用户

发布于 2014-12-01 18:26:39

这实际上取决于您的mmap()实现。将文件映射到内存有几个优点,可以被内核利用:

  • 内核知道mmap()页面的内容已经存在于磁盘上。如果它决定删除这些页面,它可以省略回写。
  • 减少复制操作:read()操作通常首先将数据读入内核内存,然后复制到用户空间。
  • 减少的副本还意味着用于从文件存储数据的内存减少,这意味着更多的内存可用于其他用途,这也可以减少分页。 这也是为什么在I/O库中使用大型缓存通常是个坏主意:现代内核已经缓存了从磁盘读取的所有内容,在用户空间中缓存副本意味着可以缓存的数据量实际上减少了。

当然,您还可以避免在应用程序中缓冲未知大小的数据而引起的许多麻烦。但作为程序员,这只是一种方便。

然而,即使内核可以利用这些属性,它也不一定这样做。我的经验是,LINUX mmap()一般都很好;但是,在AIX上,我看到了非常糟糕的mmap()性能。所以,如果你的目标是表现,那是老的衡量标准--比较--决定待命。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27233564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档