2015-07-10 33 views
3

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

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

回答

2

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

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

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

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

+0

好的。我正在构建一个64位程序。因此,如果我的理解正确,我可以在整个40GB空间中使用MapViewOfFile,并且操作系统将处理读取和写入操作? –

+0

理论上,是的。我无法保证MapViewOfFile能够成功处理大量的请求,但值得一试。我正在假设您正在阅读现有的大文件。如果您尝试创建一个,那么您可能会受到分页文件大小的限制。 –