文件映射的工作原理

DSP*_*ent 4 c++ winapi windows-7 file-mapping visual-studio-2013

我正在编写一个需要遍历 40gb 大二进制文件的程序,但我只有 16gb 的物理 RAM。一个朋友告诉我,我可以使用文件映射来缓解这个问题。我了解如何创建文件映射读入文件映射句柄,以及文件映射如何将持久内存中的文件部分映射到不同的虚拟内存块以供读取。

因此,如果我正确理解这一点,我可以创建一个 10gb 的缓冲区,并将文件的前 10gb 读入该缓冲区。但是当我必须读取文件上的 10gb 标记时,操作系统会自动为我获取另一个块,还是我必须在我的代码中手动执行此操作?

Adr*_*thy 5

您链接到的函数与文件映射没有(直接)相关。它们用于常规文件 I/O。

要对非常大的文件使用传统的文件 I/O,您可以按照您的描述进行操作。您将打开文件,创建一个缓冲区,然后将文件的一个块读入缓冲区。当您需要访问文件的不同部分时,您将不同的块读入缓冲区。

要使用文件映射,请使用 CreateFile、CreateFileMappingMapViewOfFile。您不会(直接)创建缓冲区并将文件的一部分读入其中。相反,您告诉系统您要访问文件的某个范围,就好像它是一个内存地址范围一样。对这些地址的读取和写入在幕后变成了文件 I/O 操作。在这种方法中,您可能仍然需要分块工作。如果您需要访问的文件部分不在您当前映射的范围内,您可以创建另一个视图(并可能关闭另一个视图)。

但请注意,我说的是地址空间,它不同于RAM。如果您正在为 64 位 Windows 构建,您可以尝试将整个 40 GB 文件映射到您的地址空间。您只有 16 GB 的 RAM 这一事实不会阻止您。在这个大小上可能还有其他一些问题,但这不会是因为你的 RAM。如果还有其他问题,您将像以前一样以块的形式管理文件。