我正在使用内存映射文件对Windows 7 64bit下的大量图像文件(约10000 x 16 MB)进行读写访问。我的目标是
尽可能多地缓存数据
能够以最快的速度分配新的图像并写入这些图像。
因此我使用内存映射文件来访问文件。缓存的效果很好,但是操作系统在我快用完物理内存的时候才会刷新脏页。正因为如此,一旦物理内存被填满,分配和写入新文件的速度就相当慢。
一个解决方案是定期使用 FlushViewOfFile()
但这个函数直到数据被写入磁盘后才返回。
有什么方法可以异步刷新文件映射?我找到的唯一解决办法是 Unmap()
和 MapViewOfFile()
再来一次,但使用这种方法我不能确保再次得到相同的数据指针。谁能给个更好的方法?
编辑:看了 WINAPI
文档时间稍长,我似乎找到了一个合适的解决方案。
调用 VirtualUnlock()
在未锁定的内存范围内,导致脏页被刷新。
我听说FlushViewOfFile()函数并没有等到它实际写入文件。
http:/msdn.microsoft.comen-uslibrarywindowsdesktopaa366563(v=vs.85).aspx。
FlushViewOfFile函数 不刷新文件元数据,它不会等待返回,直到更改被刷新。 从底层硬件磁盘缓存中提取数据,并实际写入磁盘。
调用 "FlushFileBuffers(...) "后,你的数据将被物理写入磁盘。