.NET 4 BCL の新機能 (4) : メモリマップドファイル

メモリマップドファイルは、巨大なファイルの編集や、プロセス間通信のための共有メモリの作成を可能にする新機能。プロセスのアドレス空間をファイルにマップし、その後はメモリを読み書きしたり、ファイルのコンテンツを編集したりできる。ファイルは OS のメモリ管理機構を通じてアクセスされるので、自動的に多くのページに分割される (必要に応じてページイン/ページアウトされる)。開発者自身でメモリを管理する必要がなくなるので、巨大なファイルを簡単に扱えるようになるし、ファイルに完全にランダムアクセスできるようにもなる。

メモリマップドファイルを使うためには、MemoryMappedFile クラスの以下のメソッドで MemoryMappedFile クラスのインスタンスを作る (このクラスは System.IO.MemoryMappedFiles 名前空間にある)。

  • CreateFromFile
  • CreateNew
  • CreateOrOpen
  • OpenExisting

インスタンスを生成したら、CreateViewStream メソッドや CreateViewAccessor メソッドで、実際にファイルとアドレス空間をマップするためのビューを作る。CreateViewStream メソッドではシーケンシャルアクセス用の Stream が得られる (.NET の一般的な Stream と同じように使用可能)。CreateViewAccessor はランダムアクセスが可能な MemoryMappedFileViewAccessor クラスのインスタンスを返す。

 

サンプルコード

メモリマップドファイルを使ったプロセス間通信のサンプル。まず下のコードで mymappedfile という名前をつけたメモリマップドファイルを作成し、”Hello World!” を書き込んだ後、別プロセスを立ち上げている。

using (varmmf = MemoryMappedFile.CreateNew("mymappedfile", 1000))
{
using (var stream = mmf.CreateViewStream())
{
var writer = new BinaryWriter(stream);
writer.Write("Hello World!");
var startInfo = new ProcessStartInfo("process2.exe");
startInfo.UseShellExecute = false;
Process.Start(startInfo).WaitForExit();
}
}



立ち上がった別プロセスのコードがこちら。メモリマップドファイルを作った時に指定したのと同じ名前でアクセスし、データの読み込みを行っている。




using (varmmf = MemoryMappedFile.OpenExisting("mymappedfile"))
{
using (var stream = mmf.CreateViewStream())
{
var reader = new BinaryReader(stream);
Console.WriteLine(reader.ReadString());
}
}

Comments

Popular posts from this blog

TFS: 別PCでのチェックアウトを取り消す

WPF の RichTextBox に文字列を設定する&取り出す

WPFアプリにアニメーションGIFを表示させる