c-Windows 64和32位可以使用MapViewOfFile映射的最大文件大小



我正在处理一个需要打开大文件(数百GB,可能是TB(的项目。我需要对这些文件进行更改,所以我的计划是映射文件,而不是创建另一个文件,读取原始文件,进行更改,然后保存。

这就是我的想法:

hFile = CreateFile(filename, (GENERIC_READ | GENERIC_WRITE), 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE) {
return;
}
hFileMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);
if (hFileMap == NULL) {
CloseHandle(hFile);
return;
}
mapView = MapViewOfFile(hFileMap, FILE_MAP_ALL_ACCESS, 0, 0, amount);
if (mapView == NULL) {
CloseHandle(hFile);
CloseHandle(hFileMap);
return;
}

在对MapViewOfFile进行了更多的读取之后,似乎这被映射到了程序虚拟地址空间中。对于我正在读取的64位机器,最大大小为2^64字节(16 EB(。对于32位,它是2GB。

如果64位数字是正确的,我就不需要对文件进行任何类型的分块和创建多个视图。但是在32位上,如果我遇到一个大(>2GB(的文件,我需要对其进行分块?

RAM或HDD空间的数量是否也受到限制?

32位的有效限制远小于2GB。说不出有多小。问题是地址空间与其他内存分配、特殊系统页面和其他加载的.DLLs共享。

例如,如果您的应用程序使用打开/保存通用对话框,那么它将加载COM和您可能安装的任何第三方外壳扩展(NSE、图标覆盖、上下文菜单等(。DLL可能会在一段时间内保持加载状态(有些永远不会卸载(,导致您的地址空间变得支离破碎,无法留下大量可用地址。

缓解这种情况的一种方法是在程序的早期调用VirtualAlloc,以保留较大的范围,可能是500-1000MB。在映射文件之前释放保留范围。

如果您的文件总是>1GB,并且您想支持32位,那么您必须实现一个以较小块映射的替代例程。对于64位,地址空间非常大,您应该不会遇到缺少可用地址的问题。

将文件映射到内存是不可用的,它将需要一些空闲的RAM用于页表。这可能是特定于体系结构的。

最新更新