Наше программное обеспечение распаковывает определенные байтовые данные через GZipStream
, который считывает данные из MemoryStream
. Эти данные распаковываются в блоках 4 КБ и записываются в другой MemoryStream
.
Мы поняли, что память, которую выделяет процесс, намного выше, чем фактические распакованные данные.
Пример:
Сжатый массив байтов с 2425536 байтами распадается до 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