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

问题描述 投票:10回答:1

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

  1. 尽可能多地缓存数据

  2. 能够以最快的速度分配新的图像并写入这些图像。

因此我使用内存映射文件来访问文件。缓存的效果很好,但是操作系统在我快用完物理内存的时候才会刷新脏页。正因为如此,一旦物理内存被填满,分配和写入新文件的速度就相当慢。

一个解决方案是定期使用 FlushViewOfFile()但这个函数直到数据被写入磁盘后才返回。

有什么方法可以异步刷新文件映射?我找到的唯一解决办法是 Unmap()MapViewOfFile() 再来一次,但使用这种方法我不能确保再次得到相同的数据指针。谁能给个更好的方法?

编辑:看了 WINAPI 文档时间稍长,我似乎找到了一个合适的解决方案。

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

c++ memory-mapped-files
1个回答
2
投票

我听说FlushViewOfFile()函数并没有等到它实际写入文件。

http:/msdn.microsoft.comen-uslibrarywindowsdesktopaa366563(v=vs.85).aspx。

FlushViewOfFile函数 不刷新文件元数据,它不会等待返回,直到更改被刷新。 从底层硬件磁盘缓存中提取数据,并实际写入磁盘。

调用 "FlushFileBuffers(...) "后,你的数据将被物理写入磁盘。

© www.soinside.com 2019 - 2024. All rights reserved.