C++ 内存映射与64位进程堆

C++ 内存映射与64位进程堆,c++,64-bit,paging,mmap,heap-memory,C++,64 Bit,Paging,Mmap,Heap Memory,如果64位程序需要消耗大量内存,那么内存是在进程堆中分配还是从内存映射文件中分配有关系吗?我了解内存映射文件的其他好处,如跨两个或多个进程共享,但在我的情况下,内存映射中的数据不会跨进程共享 还不完全清楚您的意思是什么,特别是考虑到大型分配[根据C库中的某些大型定义,取决于设置]通常是通过使用匿名mmap区域来实现的,也就是说,内存映射文件实际上没有真正的文件支持它们-操作系统使用/dev/zero作为文件,因此,当从文件中调入内存时,它的读数为零。它永远不会被回写…] 换句话说,虽然堆是由C库

如果64位程序需要消耗大量内存,那么内存是在进程堆中分配还是从内存映射文件中分配有关系吗?我了解内存映射文件的其他好处,如跨两个或多个进程共享,但在我的情况下,内存映射中的数据不会跨进程共享

还不完全清楚您的意思是什么,特别是考虑到大型分配[根据C库中的某些大型定义,取决于设置]通常是通过使用匿名mmap区域来实现的,也就是说,内存映射文件实际上没有真正的文件支持它们-操作系统使用/dev/zero作为文件,因此,当从文件中调入内存时,它的读数为零。它永远不会被回写…]

换句话说,虽然堆是由C库管理的内存,但如果您手动管理内存映射文件,则必须在代码中进行管理,否则也是一样的

编辑:

针对该评论:

这实际上取决于:

系统中的内存量。如果您有1TB+,那么您可能可以使用两种方法中的任何一种,并获得大致相同的结果。 文件中的节有多大-如果您在许多不同的地方读取的小部分明显小于4KB,那么malloc可能会获胜。如果您正在处理的文件部分要大得多,则两种方法的内存使用率都差不多。 如果您的内存远远少于正在处理的实际数据量,则这两种方法都无法提供良好的性能,因为在磁盘中读取/写入数据和/或分配/释放内存所花费的时间太多


一般来说,将文件映射到内存是将数据加载到内存中的最快方法操作系统从磁盘复制数据到内存中最终位置的时间更少。但对于任何相对较大的文件,数据从磁盘上传输的实际速度将是主要因素,而且无论您做什么,这将决定读取1TB文件所需的时间

感谢您花时间发表评论。基本上我的要求很简单,程序是64位可寻址的,它可能需要消耗大量内存,比如说1TB+的处理数据的顺序。想知道使用mmap映射1TB的文件并使用它来存储数据是否有任何好处,而使用简单的malloc只分配相同数量的内存。谢谢