32位及64位Windows系统中MapViewOfFile可映射的最大文件大小是多少
32位大文件映射及映射大小限制问题解答
32位环境大于2GB文件的处理方案
- 32位环境下必须对大文件做分块映射处理。32位进程默认可用的用户态虚拟地址空间仅为2GB,即便开启大地址感知扩展也最多只有3GB,扣除程序自身代码、堆、栈、动态链接库占用的地址空间后,实际可用的连续虚拟地址空间通常不足1.5GB,完全无法承载2GB以上的单块文件映射。
- 分块映射的注意事项:每次映射的文件偏移需要和系统分配粒度对齐,可通过
GetSystemInfo接口获取dwAllocationGranularity参数作为对齐基准,处理完当前块后调用UnmapViewOfFile释放当前视图占用的虚拟地址空间,再映射下一段文件内容即可。
可映射文件大小的限制条件
- 硬盘空间限制:读写类型的文件映射需要占用对应大小的硬盘空间,如果你调用
CreateFileMapping时指定的映射大小超过源文件现有大小,系统会自动对源文件执行扩容操作,此时硬盘需要有足够的空闲空间才能完成操作,否则映射会创建失败。 - RAM限制:文件映射属于虚拟内存范畴,不需要整个文件全部加载到物理内存中即可运行,系统会按需自动执行页的换入换出。比如64位环境下即使物理内存只有16GB,也可以正常映射10TB级的文件,仅当频繁随机访问文件不同位置时,物理内存不足会导致页交换频率升高、处理性能下降,但不会直接导致映射失败。
现有代码优化提示
你当前的实现逻辑在64位且文件大小不超过可用虚拟地址空间的场景下可正常运行,补充两个注意点:
- 执行修改操作后建议调用
FlushViewOfFile将修改刷入磁盘,避免异常断电导致修改丢失 - 所有操作完成后需按顺序释放资源:先
UnmapViewOfFile取消视图映射,再CloseHandle关闭文件映射句柄,最后CloseHandle关闭文件句柄,避免资源泄漏。
内容的提问来源于stack exchange,提问作者xx9000
相关产品推荐
相关产品推荐

