У меня около 270 тыс. пар блоков данных, каждая пара состоит из одного блока 32 КБ и одного блока 16 КБ.
Когда я сохраняю их в один файл, я, конечно, получаю очень большой файл. Но данные легко сжимаются.
После сжатия файла размером 5,48 ГиБ с помощью WinRAR при сильном сжатии результирующий размер файла составляет 37,4 МиБ.
Но мне нужен произвольный доступ к каждому отдельному блоку, поэтому я могу сжимать блоки только по отдельности.
Для этого я использовал класс Deflate, предоставленный .NET, который уменьшил размер файла до 382 МБ (с чем я мог жить).< br> Но скорости недостаточно.
Большая часть потери скорости, вероятно, связана с постоянным созданием нового экземпляра MemoryStream и Deflate для каждого блока. Но, кажется, они не предназначены для повторного использования.
И я предполагаю (намного?) лучшее сжатие может быть достигнуто, когда используется «глобальный» словарь вместо одного для каждого блока.
Существует ли реализация алгоритма сжатия (желательно на C#), которая подходит для этой задачи?
Следующая ссылка содержит процент, с которым встречается каждый номер байта, разделенный на три типа блоков (только блоки 32 КБ). Первый и третий тип блоков имеют встречаемость 37,5%, а второй 25%. Проценты типов блоков
Короткая история: Type1 состоит в основном из единиц. Тип 2 состоит в основном из нулей и единиц. Тип 3 состоит в основном из нулей. Значения больше 128 не встречаются (пока).
Блок размером 16 КБ почти всегда состоит из нулей.