![](/img/trans.png)
[英]How to flush memory-mapped files using Boost's `mapped_file_sink` class?
[英]How to asynchronously flush a memory mapped file?
我正在使用内存映射文件对 Windows 7 64 位下的大量图像文件 (~10000 x 16 MB) 进行读/写访问。 我的目标是:
尽可能多地缓存数据。
能够分配新图像并尽快写入这些图像。
因此我使用内存映射文件来访问文件。 缓存运行良好,但操作系统不会刷新脏页,直到我几乎用完物理内存。 因此,一旦物理内存已满,分配和写入新文件的速度就会非常慢。
一种解决方案是定期使用FlushViewOfFile()
,但此函数在数据写入磁盘之前不会返回。
有没有办法异步刷新文件映射? 我找到的唯一解决方案是再次使用Unmap()
和MapViewOfFile()
,但是使用这种方法我不能确定再次获得相同的数据指针。 有人可以建议更好的方法吗?
编辑:再阅读WINAPI
文档,似乎我找到了适合我的问题的解决方案:
在未锁定的内存范围内调用VirtualUnlock()
会导致刷新脏页。
我听说 FlushViewOfFile() 函数不会等到它实际写入文件。
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366563(v=vs.85).aspx
FlushViewOfFile 函数不会刷新文件元数据,并且它不会等到更改从底层硬件磁盘缓存中刷新并物理写入磁盘后才返回。
在调用“FlushFileBuffers(...)”之后,您的数据将被物理写入磁盘。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.