Windows与Linux下能否映射超出当前文件大小的内存块?
Windows与Linux下小文件创建大内存映射的可行性分析
核心需求
文件仅包含少量字节数据,希望创建多个约1MB的内存映射块,随文件增长读取新增数据;文件由同一程序写入,确保不访问文件末尾以外的内存,避免每次追加数据都重新调用mmap类接口。
Linux 平台
查阅man 2 mmap文档,未发现禁止映射大小超过文件实际尺寸的明确限制。实际操作中,只要严格保证不访问文件实际末尾以外的内存区域,就可以创建大于当前文件大小的内存映射块。后续文件追加数据后,无需重新调用mmap,直接从已映射的内存区域读取新增内容即可(可通过msync主动同步文件与内存映射状态,或依赖系统自动同步机制)。
Windows 平台
Windows内存映射分为CreateFileMapping和MapViewOfFile两个步骤:
MapViewOfFile可映射的范围受限于CreateFileMapping设置的大小。- 你可以直接调用
CreateFileMapping时设置极大的最大文件大小(比如100TB),指定FILE_MAP_ALL_ACCESS权限,并通过dwMaximumSizeHigh和dwMaximumSizeLow参数设置对应大值。后续文件增长至对应尺寸的过程中,可直接通过MapViewOfFile创建对应范围的视图,无需重新创建文件映射对象。需注意两点:- 系统需要为该大尺寸映射对象预留虚拟地址空间,需确保进程有足够虚拟内存可用。
- 实际写入文件时,必须保证文件物理大小确实增长到对应位置,否则访问未实际写入的区域会触发内存错误。
第三方库现状
- folly的MemoryMap实现:不允许映射大小超过文件实际大小。
- Python的
mmap模块:同样限制映射大小不能超过文件当前尺寸。 - boost.interprocess:暂无明确官方说明,但从其依赖系统原生API的设计逻辑来看,应该支持类似Linux/Windows原生的操作方式,建议直接测试验证。
内容的提问来源于stack exchange,提问作者Johannes Schaub - litb
相关产品推荐
相关产品推荐

