内存映射一个巨大的文件在32位软件运行在64位操作系统
Memory mapping a huge file in 32 bit software running on 64 bit OS
我在读取大文件时遇到性能问题。我想用内存映射来解决这个问题。输入文件的大小高达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(因为单独的进程有单独的地址空间),但这样做确实不切实际。
相关文章:
- 在node-gip binding.gyp文件中,如何根据系统结构(32位、64位)包含不同的库文件
- 如何从 Linux 交叉编译到 32 位 Windows 可执行文件
- 在 64 位 Linux armv8 计算机上编译 32 位二进制文件时遇到问题
- 无法在 64 位 Debian 上运行 32 位二进制文件
- Visual C 32位整数从文件到8位字符到文件 - 程序在某些整数上崩溃
- 无法在 Windows 7、32 位上使用 tdm-gcc 构建 cpp 文件(表示 exe 不兼容)
- 我正在尝试使用 Windows 映像组件加载 32 位图像,将其翻转,然后将其再次保存回同一文件中
- 将Windows上32位和64位的Boost构建到同一文件夹中
- 区分 32 位和 cl.exe 生成的 64 位 PE 对象文件(Visual Studio C++)
- Visual Studio - C++ - 以 32 位或 64 位构建和运行应用程序 - 从适当的程序文件目录加载 D
- 使用Solaris 64位或Linux 32位到Linux 64位的内存映射文件
- 32位Visual Studio生成64位可执行文件
- 为什么在 32 位 armv7l 上 mmap 一个 4GB 文件成功
- 32位应用程序链接到System32二进制文件,而不是SysWOW64
- 在32位和64位处理器上运行混合的mpi可执行文件
- 如何仅将 16 位分配给二进制文件中的任何整数,而不是C++中的正常 32 位
- 当Visual Studio生成32位.obj文件和64位.obj文件时
- 64 位C++ Eclipse 正在制作 32 位可执行文件
- 在VS2010 64/32位冲突中读取转储文件
- Qt 5.5.1 MSVC 2013,32位 - LNK1181:无法打开输入文件"NIDAQmx.lib"