我正在编写一个需要遍历大型40gb二进制文件的程序,但我只有16GB的物理RAM。一位朋友告诉我,我可以使用文件映射来解决这个问题。我理解如何create a file mapping和reading into a file map handle,以及文件映射如何将永久内存中文件的各个部分映射到不同的虚拟内存块以供阅读。
因此,如果我正确理解这一点,我可以创建一个10gb的缓冲区,并将该文件的前10gb读入此缓冲区。但是当我必须读取文件上的10gb标记时,操作系统会自动为我取回另一个块,还是我必须在我的代码中手动执行此操作?
答案 0 :(得分:2)
您链接的功能与文件映射没有(直接)相关。它们用于常规文件I / O.
要将传统文件I / O与非常大的文件一起使用,您可以按照描述进行操作。您可以打开文件,创建缓冲区,并将文件块读入缓冲区。当您需要访问文件的其他部分时,您会在缓冲区中读取不同的块。
要使用文件映射,请使用CreateFile,CreateFileMapping,然后使用MapViewOfFile。您没有(直接)创建缓冲区并将文件的一部分读入其中。相反,您告诉系统您要访问该文件的范围,就好像它是一系列内存地址一样。对这些地址的读写操作将在后台转换为文件i / o操作。在这种方法中,您可能仍然需要以块的形式工作。如果您需要访问的文件部分不在您当前映射的范围内,则可以创建另一个视图(并可能关闭另一个视图)。
但请注意,我说地址空间,它与 RAM 不同。如果您正在为64位Windows构建,则可以尝试将整个40 GB文件映射到您的地址空间。您只有16 GB RAM的事实不会阻止您。这个尺寸可能还有其他一些问题,但不会因为你的RAM而出现问题。如果还有其他问题,您将像以前一样以块的形式管理文件。