4

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

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

4

1 回答 1

5

您链接到的功能与文件映射不(直接)相关。它们用于常规文件 I/O。

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

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

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

于 2015-07-10T20:38:06.473 回答