在 64 位 OS 上将 32 位软件 运行 中的大文件内存映射
Memory mapping a huge file in 32 bit software running on 64 bit OS
我在读取大文件时遇到性能问题。我想使用内存映射来解决问题。输入文件最大为 10 GB,我的程序(用 C++ 编写)是用 32 位配置构建的,目标系统是 Windows 64 位并且有 24 GB RAM。是否可以将整个大文件映射到内存?如果是,我的程序如何访问 "high" 地址区域(> 0xFFFFFFFF,理论上,因为我的程序是 32 位的,所以指针也是 32 位的)?
在 32 位程序中,您永远无法在单个进程中一次映射整个文件,因为地址 space 有 2GB 长。可以通过使用 MapViewOfFile
参数在给定时刻仅映射文件的一部分。也可以使用多个进程一次映射整个文件,每个进程映射 1GB(因为不同的进程有不同的地址 spaces),但使用起来真的不切实际。
你不能。 32 位程序使用不能超过 4GB 的 32 位指针,即使 运行 在 64 位 OS.
上也是如此
不过,有一件事可能有点帮助,那就是 link 您的程序带有 /LARGEADDRESSAWARE
选项。默认情况下,32 位 Windows 程序只能使用地址 space 的 2GB,因为某些程序假定指针的最高位始终为零,并且使用它作为标志来存储附加信息。如果 Windows 开始分配超过 2GB 的内存,那会中断,所以你必须 link 你的程序有一个特殊的选项,告诉 Windows 你的程序不会滥用那个位。这让您的程序可以使用完整的 4GB 地址 space 而不是限于 2GB。
我在读取大文件时遇到性能问题。我想使用内存映射来解决问题。输入文件最大为 10 GB,我的程序(用 C++ 编写)是用 32 位配置构建的,目标系统是 Windows 64 位并且有 24 GB RAM。是否可以将整个大文件映射到内存?如果是,我的程序如何访问 "high" 地址区域(> 0xFFFFFFFF,理论上,因为我的程序是 32 位的,所以指针也是 32 位的)?
在 32 位程序中,您永远无法在单个进程中一次映射整个文件,因为地址 space 有 2GB 长。可以通过使用 MapViewOfFile
参数在给定时刻仅映射文件的一部分。也可以使用多个进程一次映射整个文件,每个进程映射 1GB(因为不同的进程有不同的地址 spaces),但使用起来真的不切实际。
你不能。 32 位程序使用不能超过 4GB 的 32 位指针,即使 运行 在 64 位 OS.
上也是如此不过,有一件事可能有点帮助,那就是 link 您的程序带有 /LARGEADDRESSAWARE
选项。默认情况下,32 位 Windows 程序只能使用地址 space 的 2GB,因为某些程序假定指针的最高位始终为零,并且使用它作为标志来存储附加信息。如果 Windows 开始分配超过 2GB 的内存,那会中断,所以你必须 link 你的程序有一个特殊的选项,告诉 Windows 你的程序不会滥用那个位。这让您的程序可以使用完整的 4GB 地址 space 而不是限于 2GB。