内存映射一个巨大的文件在32位软件运行在64位操作系统

Memory mapping a huge file in 32 bit software running on 64 bit OS

本文关键字:32位 文件 软件 运行 操作系统 64位 巨大 映射 一个 内存      更新时间:2023-10-16

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

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

不过,有一件事可能会有所帮助,那就是将您的程序与/LARGEADDRESSAWARE选项链接起来。默认情况下,32位Windows程序只能使用2GB的地址空间,因为一些程序假设指针的最上位始终为零,并将其用作存储附加信息的标志。如果Windows开始分配超过2GB的内存,这个问题就会被打破,所以你必须把你的程序与一个特殊的选项链接起来,告诉Windows你的程序不会滥用这一点。这可以让您的程序使用完整的4GB地址空间,而不是限制在2GB。

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