[英]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.