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