Почему поток памяти C # резервирует столько памяти?
Наше программное обеспечение распаковывает определенные байтовые данные черезGZipStream
, который читает данные изMemoryStream
, Эти данные распаковываются в блоки по 4 КБ и записываются в другойMemoryStream
.
Мы поняли, что память, выделяемая процессом, намного выше, чем фактические распакованные данные.
Пример: сжатый байтовый массив с 2425 536 байтами распаковывается до 23 050 718 байтов. Профилировщик памяти, который мы используем, показывает, что методMemoryStream.set_Capacity(Int32 value)
выделено 67 104 936 байт. Это коэффициент 2,9 между зарезервированной и фактически записанной памятью.
Замечания:MemoryStream.set_Capacity
вызывается изMemoryStream.EnsureCapacity
который сам по себе вызывается изMemoryStream.Write
в нашей функции.
ПочемуMemoryStream
зарезервировать столько емкости, даже если он добавляет только блоки по 4 КБ?
Вот фрагмент кода, который распаковывает данные:
private byte[] Decompress(byte[] data)
{
using (MemoryStream compressedStream = new MemoryStream(data))
using (GZipStream zipStream = new GZipStream(compressedStream, CompressionMode.Decompress))
using (MemoryStream resultStream = new MemoryStream())
{
byte[] buffer = new byte[4096];
int iCount = 0;
while ((iCount = zipStream.Read(buffer, 0, buffer.Length)) > 0)
{
resultStream.Write(buffer, 0, iCount);
}
return resultStream.ToArray();
}
}
Примечание. Если необходимо, это конфигурация системы:
Windows XP 32bit,.NET 3.5Скомпилировано с Visual Studio 2008