【问题标题】:Is there a way to load a memory mapped file into memory at once有没有办法一次将内存映射文件加载到内存中
【发布时间】:2012-12-08 16:44:40
【问题描述】:

我有一个大的二进制文件(大约 1 GB),我想按顺序处理它。我正在使用内存映射文件来访问该文件。有没有办法告诉 Windows 尽快交换整个文件?目前,每次出现页面错误时,windows 似乎只加载一个页面,从而导致处理速度非常慢。

【问题讨论】:

  • 为什么不自己把整个文件加载到内存中呢?
  • 您对瓶颈的分析听起来不可信。无论如何,内存映射文件在这里都是大材小用。对流进行顺序文件处理。您需要一个维护自己的缓冲区的流,以便您可以大块地访问 OS 读取功能。
  • @Steve-o:很多原因:我想修改文件的一部分——如果它是一个映射文件,那就容易多了。第二次读取文件意味着等到整个文件都在内存中再处理它。通过使用 MMF,我可以在它仍在读取时开始处理(可能使用异步 IO,但更难做到)。第三,如果没有足够的 RAM,完全读取文件将意味着大量非常低效的交换。
  • @DavidHeffernan:我可以进行流处理,但如果我能找到一种尽快加载 MMF 的方法,它的代码会更复杂,效率也会更低。但这与问题无关,所以我没有在问题中提及。
  • 它不会变得更复杂,当然也不会降低效率。无论如何,我严重质疑您对问题的诊断。

标签: windows winapi


【解决方案1】:

我真的很惊讶没有人提到PrefetchVirtualMemory

BOOL WINAPI PrefetchVirtualMemory(
  _In_  HANDLE hProcess,
  _In_  ULONG_PTR NumberOfEntries,
  _In_  PWIN32_MEMORY_RANGE_ENTRY VirtualAddresses,
  _In_  ULONG Flags
);

这里有一些其他链接:

就我个人而言,我不知道这是否适合您的应用程序。但可以肯定 - 尝试一下,看看是否有帮助!

恕我直言..

【讨论】:

【解决方案2】:

如果您希望强制将文件的一部分分页到内存中,请使用您用于创建文件映射的文件句柄调用 ReadFile

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-28
    • 2021-11-26
    • 2011-05-26
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多