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