おひさしぶりです。 みやじーです。
最近C#でツールの作成をしている際に、
20Gバイト程度のファイルを扱う必要が出てきてしまい、
一度にメモリには載らないので困っていたのですが・・・
“メモリマップドファイル”というものを耳にしたので調べてみました
System.IO.MemoryMappedFiles名前空間にある
“MemoryMappedFile”というクラスが非常に便利です
このクラスは、メモリ上にファイルをマッピングして扱うことができます。
シーク処理などは、クラス内部で隠ぺいしてくれているため、
非常に簡単にデータを取り扱うことが可能です。
一度にメモリに載らないファイルもこれで簡単に扱えます
(使用例)
string fileName = "test.dat" using (var memoryMappedFile = MemoryMappedFile.CreateFromFile(fileName)) { using (var viewAccessor = memoryMappedFile.CreateViewAccessor()) { // 100000byte目に書き込む byte val = 100; viewAccessor.Write(100000, val); // 100000byte目から読み込む val = viewAccessor.ReadByte(100000); } }
詳しくは
http://msdn.microsoft.com/ja-jp/library/vstudio/dd267544.aspx
同様の機能のクラスを自作しようとしていたのですが、
こちらを使用して事なきを得ました。
また、プロセス間で情報を共有する手段としても使えるので、
こちらの用途でもお世話になりそうです
非常に便利なクラスなのでぜひ使用してみて下さい