内存映射与64位进程堆

时间:2014-03-14 20:44:22

标签: c++ 64-bit paging mmap heap-memory

如果64位程序想要占用大量内存,那么在进程堆中还是从内存映射文件中分配内存是否重要?我理解内存映射文件的其他好处,例如跨两个或多个进程共享,但是,在我的情况下,内存映射中的数据不是跨进程共享的。

1 个答案:

答案 0 :(得分:0)

不完全清楚你的意思是什么区别,特别是考虑到通过使用匿名mmap区域(即内存映射文件)来进行大量分配[通过某种大型定义依赖于C库中的设置]实际上并没有真正支持它们的文件 - 操作系统使用/ dev / zero作为“文件”,因此当从“文件”中读入内存时,它读为零。它永远不会被写回...] 。

换句话说,虽然“堆”是由C库管理的内存,但如果您手动管理内存映射文件,则必须在代码中执行“管理”,否则它就是同样的事情。

编辑:

回应评论:

这真的取决于:

  1. 系统中的内存量。如果你有1TB +,那么你可能能够使用任何一种方法得到大致相同的结果。
  2. 这些部分来自文件的大小 - 如果您在许多不同的地方阅读很少的部分(明显少于4KB),那么malloc可能会获胜。如果你正在处理的文件部分要大得多,那么任何一种方法都会有相同的内存使用率。
  3. 如果你的内存少于你正在处理的实际数据量,那么这两种方法都不会提供良好的性能,因为在磁盘上读取/写入数据和/或分配/解除分配内存所花费的时间太多。

    通常,将文件映射到内存是将数据加载到内存中的最快方法(操作系统在从磁盘到内存中最终位置的路上复制数据的次数较少)。但是对于任何相对较大的文件,数据脱离磁盘的实际速度将是主要因素,无论你做什么,这将占据读取1TB文件所需的时间。