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

9
我正在使用内存映射文件在Windows 7 64位系统下读取/写入大量图像文件(~10000 x 16 MB)。我的目标是:
  1. 尽可能多地缓存数据。

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

因此,我使用内存映射文件来访问文件。缓存效果很好,但操作系统直到我几乎用完物理内存才会刷新脏页。因此,一旦物理内存被占满,分配和写入新文件就变得相当缓慢。
一个解决方案是定期使用FlushViewOfFile(),但这个函数在数据写入磁盘之前不会返回。
有没有一种方法可以异步刷新文件映射?我找到的唯一解决方案是Unmap()MapViewOfFile(),但是使用这种方法,我无法确保再次获取相同的数据指针。有人能建议更好的方法吗?
编辑: 仔细阅读WINAPI文档后,我似乎找到了适合我的问题的解决方案:
调用未锁定的内存范围上的VirtualUnlock()将导致刷新脏页。
1个回答

2
我听说FlushViewOfFile()函数不会等待直到数据物理写入文件。

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

FlushViewOfFile函数不会刷新文件元数据,并且它不会等待返回,直到更改从底层硬件磁盘高速缓存中刷新并物理写入磁盘。调用“FlushFileBuffers(...)”后,您的数据将被物理写入磁盘。

我刚在Windows 10上执行了微基准测试,并发现调用FlushViewOfFile()是阻塞的(尽管可能不是有意为之)。您是否有任何关于如何复制Linux的MS_ASYNC行为的见解? - Joannes Vermorel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接