Каков оптимальный размер словаря для различных алгоритмов сжатия? - PullRequest
0 голосов
/ 21 июня 2019

По разным причинам я использую LZMA2 для сжатия множества блоков данных разного размера. Поскольку параллельно обрабатывается много блоков, использование памяти необходимо поддерживать на разумном уровне. Учитывая n байтов данных, какой будет оптимальный размер словаря? Типичные исходные блоки различаются по размеру от 4 КБ до 4 МБ.

Я полагаю, что нет смысла иметь размер словаря больше, чем число байтов для сжатия? Я также предполагаю, что если бы данные сжимались до половины размера, не было бы смысла иметь размер словаря, превышающий n / 2 байта.

Конечно, это всего лишь предположение, и мы будем очень признательны за понимание того, почему это так или нет,

Приветствия

John

Ответы [ 2 ]

0 голосов
/ 21 июня 2019

Словарь размера m фактически является памятью последних увиденных байтов несжатых данных, ограниченных пределом m.Таким образом, для вашего использования, m := n будет оптимальным вариантом для наилучшего использования сжатия LZMA в автономном режиме.

Если у ваших блоков есть сходства, вы можете еще больше улучшить степень сжатия, обучив LZMA блоком образцов.размером t, который известен как компрессору, так и декомпрессору (подробнее см. «обученное сжатие» в Интернете).В этом случае m := n + t будет идеальным.

0 голосов
/ 21 июня 2019

Вероятно, нет абсолютного оптимума, так как это зависит от ваших конкретных потребностей. Алгоритмы сжатия (хотя я не знаю конкретно о LZMA) часто позволяют настраивать параметры, чтобы найти лучший компромисс между потреблением памяти, скоростью сжатия и степенью сжатия. Вам нужно будет поиграть с этими параметрами и посмотреть, как они повлияли на вашу фактическую нагрузку. Скорее всего, параметры по умолчанию довольно хороши, и настройка требуется только в том случае, если ваши требования необычны, например, если у вас жесткая память или временные ограничения.

...