Бонсуар, господа!
В общем есть у меня программка, которая:
- Читает файл и записывает в буфер байты
- Через GZipStream сжимает данные и опять же записывает их заново в то самый буфер
- Читает буфер и записывает данные в память
Т.е смотрите.
Первый снимок это пустой буфер.
Второй снимок это создание MemoryStream, запись в него данных буфера (
GC), использование этого MemoryStream в GZipStream, запись данных в буфер. (GC для обоих Stream)
Третий снимок это запись данных буфера в файл.
GC - этим я пометил моменты, на которых должна быть сборка мусора.
Если точнее то эти моменты выглядят так:
byte[] buffer = new byte[1000000000]; // RAM заюзалась
buffer = null;
buffer = new byte[100]; // (<b>GC</b>) тот же самый буфер. Но памяти при этом выделено под 1000000100 байт.
В конечном итоге у меня 0.5гб оперативки для работе с файлом в 100мб.
Читаем файл +100мб
Создаем MemoryStream +0мб = 100мб
Сжимает данные GZip`ом и пишем их в MemoryStream +131мб (
сжатые данные весят больше WTF?????) = 230мб
.... +100мб = 330мб
Создаем файл, пишем в него данные из буфера +0мб = 230
В конце концов GC срабатывает на последней строчке кода -200мб = 130мб (остатки от буфера)
Каждый ресурс использую через
using
Перед каждой записью новой порцией данных в буфер, я его null`ую.
Как заставить GC работать агрессивнее?Доп.: Какого черта GZipStream с CompressionLevel.Optimal выдает больше данных чем было? (не актуально для действительно сжимаемых данных, такие как тестовые файлы, изображения)