我正在写一个程序,需要遍历一个大的 40gb 二进制文件,但我只有 16gb 的物理 RAM。一位朋友告诉我,我可以使用文件映射来缓解这个问题。我了解如何create a file mapping和reading into a file map handle,以及文件映射如何将持久内存中的文件部分映射到不同的虚拟内存块进行读取。
所以,如果我正确理解这一点,我可以创建一个说 10gb 的缓冲区,并读取文件的第一个 10gb 到这个缓冲区。但是当我必须读取文件上的 10gb 标记时,操作系统会自动为我获取另一个块,还是必须在我的代码中手动执行?
您链接到的函数与文件映射不(直接)相关。它们用于常规文件 I / O。
要对非常大的文件使用传统的文件 I / O,您可以按照描述进行操作。您将打开文件,创建缓冲区,然后将文件的一个块读入缓冲区。当您需要访问文件的不同部分时,您将不同的块读入缓冲区。
要使用文件映射,您可以使用 CreateFile,CreateFileMapping,然后使用MapViewOfFile。您不 (直接) 创建缓冲区并将文件的一部分读入其中。相反,您告诉系统您想要访问文件的一个范围,就好像它是一个内存地址的范围一样。读取和写入这些地址都可以变成文件 i / o 操作的另一部分在幕后。在这种方法中,您可能仍然需要
但请注意,我说的是地址空间,它与RAM不同。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(76条)