次のテスト コード (x64 環境) が与えられた場合:
static void Test()
{
string fileName = @"d:\map";
long length = new FileInfo(fileName).Length;
using (var file = MemoryMappedFile.CreateFromFile(fileName, FileMode.Open, "mapFile", length, MemoryMappedFileAccess.ReadWrite))
{
byte* bytePtr = (byte*)0;
var view = file.CreateViewAccessor(0, length, MemoryMappedFileAccess.ReadWrite);
view.SafeMemoryMappedViewHandle.AcquirePointer(ref bytePtr);
long count = (long)(length / sizeof(int));
long sum = 0;
long step = count / 2000;
int* ptr = (int*)&bytePtr[0];
long currentCount = 0 ;
Parallel.For(0, count, new ParallelOptions { MaxDegreeOfParallelism = 8 }, (i) =>
{
Interlocked.Add(ref sum, ptr[i]);
Interlocked.Increment(ref currentCount) ;
if (currentCount % step == 0)
Console.Write("\r{0:0.00}%", (100 * currentCount / (float)count));
});
Console.WriteLine(sum);
view.Dispose();
}
}
「d:\map」が 40GB のファイルであることを考えると、ポインター「ptr」を介したランダム アクセスがあると、非常に奇妙な動作が発生します。
システムの物理メモリが完全に使用され、すべてが遅くなり、このプロセスが完了するまでに 2 時間以上かかります。
シーケンシャル (およびシングル スレッド) アクセスを使用している場合、使用される物理メモリは 1GB を超えず、プロセスには約 8 分かかります。
私の質問は次のとおりです。メモリマップファイルを使用すると、「実際の」メモリが使用されますか? 占有されるのは仮想アドレス空間だけではありませんか?
メモリ マップド ファイルを使用するときの物理メモリの消費量を理解しようとしています。