マップトメモリを使用してプロセス間のデータ共有で使用しようと考えておりますが
3000×3000の24bit Bitmapのbyte配列をメモリに書き込むのにやけに時間がかかっている様に思え、これが正常なのかどうかが知りたいです
bmp.saveでRAMディスク等に書き込んだ方が速いのですが、何か間違っているのでしょうか?
プロセス間のメモリ共有については問題無く使用できますが・・・。
よろしくお願いします
c#
1MemoryMappedFile mmf; 2 3Bitmap bmp = new Bitmap(Application.StartupPath + "\Test.bmp"); // 容量の大きいBitmapファイル 4byte[] bytBmp = new byte[bmp.Width * bmp.Height * 3]; 5 6BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); 7Marshal.Copy(bmpData.Scan0, bytBmp, 0, bytBmp.Length); // Marshal Copyは大体50msくらいでコピーできる 8bmp.UnlockBits(bmpData); 9 10 11mmf = MemoryMappedFile.CreateNew("input", bytBmp.Length); 12MemoryMappedViewAccessor accessor = mmf.CreateViewAccessor(); 13 14accessor.WriteArray<byte>(0, bytBmp, 0, bytBmp.Length); // だいたい600~700msくらいかかる 15accessor.Dispose(); 16
そりゃ HDD 使ってるのでメモリと比べるのが間違ってます。
メモリ上にマッピングしている
↓
メモリに書き込んでいる
という解釈でしたが違うと言うことですね。
BitmapはHDDにSaveしても100msくらいで保存出来ますが、それ以下の速度になっています。
ちなみに厳密にはHDDではなくSSDでbmp.saveに90ms、マップトメモリでは600msで
メモリマップトファイルというのはメモリにマッピングされたファイルです。
メモリへの書き込み・読み込みと同じ手続きでファイルへの書き込み・読み込みができるようになります。
実際に使われているのが HDD か SSD か私が知るわけがありませんが、当然普通にアクセスするよりオーバーヘッドがあります。
なるほど。理解致しました。
丁寧な回答ありがとうございます。

回答3件
あなたの回答
tips
プレビュー