9

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

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

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

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

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

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

编辑:阅读WINAPI文档稍长一点,似乎我找到了一个合适的解决方案来解决我的问题:

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

4

1 回答 1

2

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

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

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

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

于 2013-07-01T02:40:41.370 回答