【问题标题】:How to asynchronously flush a memory mapped file?如何异步刷新内存映射文件?
【发布时间】:2012-07-09 07:58:31
【问题描述】:

我正在使用内存映射文件在 Windows 7 64 位下对大量图像文件(~10000 x 16 MB)进行读/写访问。我的目标是:

  1. 缓存尽可能多的数据。

  2. 能够分配新图像并尽快写入。

因此,我使用内存映射文件来访问这些文件。缓存效果很好,但操作系统不会刷新脏页,直到我几乎没有物理内存。因为一旦物理内存被填满,分配和写入新文件会很慢。

一种解决方案是定期使用FlushViewOfFile(),但该函数在数据写入磁盘之前不会返回。

有没有办法异步刷新文件映射?我找到的唯一解决方案是再次使用Unmap()MapViewOfFile(),但是使用这种方法我不能确定再次获得相同的数据指针。有人可以提出更好的方法吗?

编辑: 再看WINAPI文档,似乎找到了适合我的问题的解决方案:

在未锁定的内存范围上调用VirtualUnlock() 会导致脏页刷新。

【问题讨论】:

    标签: c++ windows winapi memory-mapped-files


    【解决方案1】:

    我听说 FlushViewOfFile() 函数不会等到它物理写入文件。

    http://msdn.microsoft.com/en-us/library/windows/desktop/aa366563(v=vs.85).aspx

    FlushViewOfFile 函数不会刷新文件元数据,它不会等到更改从底层硬件磁盘缓存刷新并物理写入磁盘后才返回。

    调用“FlushFileBuffers( ... )”之后,您的数据将被物理写入磁盘。

    【讨论】:

    • 我刚刚在 Windows 10 上执行了微基准测试,并且调用 FlushViewOfFile() 被阻塞(尽管它可能不是这样打算的)。您对复制 Linux 的 MS_ASYNC 行为有任何见解吗?
    猜你喜欢
    • 2014-11-16
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 2016-07-05
    • 2010-11-01
    • 2011-05-14
    • 2016-12-08
    • 2010-09-26
    相关资源
    最近更新 更多