内存映射在64位操作系统上运行的32位软件中的大文件

时间:2015-08-18 14:58:06

标签: c++ memory-mapped-files memory-mapping

我在阅读大文件时遇到了性能问题。我想用内存映射来解决问题。输入文件的大小最大为10 GB,我的程序(用C ++编写)是用32位配置构建的,目标系统是Windows 64位,有24 GB的RAM。这有可能将整个巨大的文件映射到内存吗?如果是,我的程序如何访问" high"地址区(> 0xFFFFFFFF,理论上,因为我的程序是32位,所以指针也是32位)?

2 个答案:

答案 0 :(得分:0)

在32位程序中,您将永远无法在一个进程中一次映射整个文件,因为地址空间长度为2GB。可以通过使用MapViewOfFile参数在给定时刻仅映射文件的一部分。也可以使用多个进程映射整个文件,每个进程映射1GB(因为单独的进程具有单独的地址空间),但这样做是不切实际的。

答案 1 :(得分:0)

你不能。 32位程序使用的32位指针即使在64位操作系统上运行也不能超过4GB。

但有一点可能有所帮助,那就是将您的程序与/LARGEADDRESSAWARE选项相关联。默认情况下,32位Windows程序只能使用 2GB 的地址空间,因为某些程序假定指针的最高位始终为零,并将其用作存储的标志附加信息。如果Windows开始分配超过2GB的内存,那就会中断,因此您必须使用一个特殊选项链接您的程序,该选项告诉Windows您的程序不会滥用该位。这使您的程序可以使用完整的4GB地址空间,而不是限制为2GB。