Выделит ли MemoryMappedFile.CreateViewStream(0, len)
управляемый блок памяти размером len
или будет выделен меньший буфер, который действует как скользящее окно для неуправляемых данных?
Мне интересно, потому что я стремлюсь заменить промежуточный буфер для десериализации, которым сегодня является MemoryStream, что доставляет мне проблемы с большими наборами данных как из-за размера буфера, так и из-за фрагментации LOH.
Если внутренний буфер потока просмотра станет того же размера, то такое переключение не будет иметь смысла.
Изменить:
В ходе быстрого теста я нашел эти числа при сравнении MemoryStream с файлом MemoryMapped. Показания от GC.GetTotalMemory(true)/1024
и Process.GetCurrentProcess.VirtualMemorySize64/1024
Выделите поток памяти объемом 1 ГБ:
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 использует только неуправляемые данные. Правильный?