【问题标题】:How File Mapping works文件映射的工作原理
【发布时间】:2015-09-29 17:17:37
【问题描述】:

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

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

【问题讨论】:

    标签: c++ winapi visual-studio-2013 windows-7 file-mapping


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 好的。我正在构建一个 64 位程序。因此,如果我理解正确,我可以在整个 40gb 空间中使用 MapViewOfFile,操作系统将处理读写操作?
    • 理论上是的。我不能保证 MapViewOfFile 会成功处理这么大的请求,但值得一试。我正在假设您正在阅读现有的大文件。如果您尝试创建一个,那么您可能会受到页面文件大小的限制。
    猜你喜欢
    • 2013-12-03
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 2018-03-30
    相关资源
    最近更新 更多