如何异步刷新内存映射文件?

时间:2012-07-09 07:58:32

标签: c++ memory-mapped-files

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

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

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

  

FlushViewOfFile函数不会刷新文件元数据,并且它不等待从基础硬件磁盘缓存刷新更改并物理写入磁盘。

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