MemoryMappedFile.CreateViewStream(0, len)
サイズ のマネージ メモリ ブロックをlen
割り当てるか、それともアンマネージ データのスライディング ウィンドウとして機能する小さなバッファを割り当てるか?
今日の MemoryStream であるデシリアライゼーション用の中間バッファーを置き換えることを目指しているため、バッファーのサイズと LOH の断片化の両方のために、大きなデータセットで問題が発生しているのではないかと思います。
ビューストリームの内部バッファが同じサイズになった場合、この切り替えを行っても意味がありません。
編集:
簡単なテストで、MemoryStream と MemoryMapped ファイルを比較すると、これらの数値が見つかりました。GC.GetTotalMemory(true)/1024
とからの読みProcess.GetCurrentProcess.VirtualMemorySize64/1024
1GB のメモリ ストリームを割り当てます。
Managed Virtual
Initial: 81 kB 190 896 kB
After alloc: 1 024 084 kB 1 244 852 kB
予想通り、マネージド メモリと仮想メモリのギグです。次に、MemoryMappedFile について:
Managed Virtual
Initial: 81 kB 189 616 kB
MMF allocated: 84 kB 189 684 kB
1GB viewstream allocd: 84 kB 1 213 368 kB
Viewstream disposed: 84 kB 190 964 kB
したがって、あまり科学的ではないテストを使用して、ViewStream は管理されていないデータのみを使用すると仮定しています。正しい?