C # Быстрое / эффективное сжатие большого количества блоков данных

у меня есть около 270 тысяч пар блоков данных, каждая пара состоит из одного блока размером 32 КБ и одного блока размером 16 КБ.

Когда я сохраняю их в один файл, я, конечно, получаю очень большой файл. Но данные легко сжимаются.
После сжатия файла 5,48 ГБ с помощью WinRAR с сильным сжатием размер результирующего файла составляет 37,4 МБ.

Но мне нужен произвольный доступ к каждому отдельному блоку, поэтому я могу только сжимать блоки по отдельности.
Для этого я использовал класс Deflate, предоставленный .NET, который уменьшил размер файла до 382 МБ (с которым я мог жить).
Но скорость недостаточна.

Большая часть потери скорости, вероятно, связана с постоянным созданием нового экземпляра MemoryStream и Deflate для каждого блока. Но, похоже, они не предназначены для повторного использования.

И я полагаю (намного?) Лучшего сжатия можно достичь, если использовать «глобальный» словарь вместо того, чтобы иметь по одному для каждого блока.

Существует ли реализация алгоритма сжатия (предпочтительно на C #), которая подходит для этой задачи?

Следующая ссылка содержит процент, с которым встречается каждый номер байта, разделенный на три типа блоков (только блоки по 32 КБ). Первый и третий типы блоков встречаются 37,5%, а второй - 25%. Проценты типов блоков

Краткая история длинного файла: Тип1 состоит в основном из единиц. Type2 состоит в основном из нулей и единиц Type3 состоит в основном из нулей Значения больше 128 не встречаются (пока).

Блок 16 КБ почти всегда состоит из нулей

5
задан Arokh 19 November 2011 в 04:44
поделиться