おひさしぶりです。 みやじーです。
最近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
同様の機能のクラスを自作しようとしていたのですが、
こちらを使用して事なきを得ました。
また、プロセス間で情報を共有する手段としても使えるので、
こちらの用途でもお世話になりそうです![]()
非常に便利なクラスなのでぜひ使用してみて下さい![]()