2012-07-09 10 views
8

私は、メモリマップファイルを使用して、Windows 7 64ビットで多数のイメージファイル(〜10000 x 16 MB)に対する読み取り/書き込みアクセス権を持っています。私の目標は以下の通りです:メモリマップファイルを非同期でフラッシュする方法はありますか?

  1. できるだけ多くのデータをキャッシュします。

  2. 新しいイメージを割り当てて、できるだけ早くそれらに書き込むことができます。

したがって、メモリマップファイルを使用してファイルにアクセスしています。キャッシュは正常に機能しますが、物理メモリがほとんどなくなるまで、OSはダーティページをフラッシュしません。そのため、物理メモリがいっぱいになると、新しいファイルの割り当てと書き込みはかなり遅くなります。

1つの解決策は、FlushViewOfFiles()を定期的に使用することですが、この機能はデータがディスクに書き込まれるまで返されません。

ファイルマッピングを非同期でフラッシュする方法はありますか?私が見つけた唯一の解決策はUnmap()MapViewOfFile()ですが、このアプローチを使用しても同じデータポインタを再度取得することはできません。誰かがより良いアプローチを提案できますか?

編集:

ダーティページのフラッシュで結果をロックされていないメモリ範囲にVirtualUnlock()を呼び出す: が少し長くWINAPIドキュメントを読むと、私が私の問題への適切な解決策を見つけたようです。

答えて

2

FlushViewOfFile()関数は、ファイルに物理的に書き込むまで待たないと聞きました。

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

FlushViewOfFile機能は、ファイルのメタデータをフラッシュしません。また、変更が基盤となるハードウェアのディスクキャッシュからを洗い流し、物理的にディスクに書き込まれるまで戻るために待機しません。

"FlushFileBuffers(...)"を呼び出した後、データは物理的にディスクに書き込まれます。

関連する問題