文件映射的工作原理

How File Mapping works

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

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

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

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

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

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