Я знаю, что больший размер может привести к лучшей степени сжатия и наоборот. Но есть ли способ решить лучше? .. поскольку существует очень много вариантов
Пока что заметил размер словаря — размер файла дает оптимальное сжатие.
Здесь файл размером ~ 8 МБ test.avi
имеет одинаковую степень сжатия для всего словаря размеры больше 8 МБ. Потом начинает падать.
Повторяемые элементы хранятся в словаре, а код назначается в качестве замены.
ЭТО Чрезмерное упрощение
aaaaaaaaaaaaaaaaaaaaaaa 0001bbbbbbbbbbbbbbbbbbbbbbbb 0002alsdjl; asjdfkl; asdfjkljj 0003
вместо всей строки он просто помещает код на свое место. Чем больше словарь, тем больше кодов он может обработать. Обычно, когда словарь заполняется, он на лету начинает новый. Когда он начинает новый, он остается пустым, и обнаруженным образцам присваиваются новые коды.
Как правило, чем больше, тем лучше. Весь словарь хранится в памяти, поэтому вам нужно больше ОЗУ, чем размер словаря.
Размер словаря зависит от сжимаемости ваших данных, количества файлов, размера и общего размера.
Как правило, 32 МБ более чем достаточно, но если вы сжимаете множество файлов с несколькими гигабайтами, то можно использовать гораздо большее количество. Словари большего размера часто замедляют процесс, но в результате получается файл меньшего размера.
Каков оптимальный размер словаря для различных алгоритмов сжатия?
По разным причинам я использую LZMA2 для сжатия многих блоки данных различного размера. Поскольку параллельно обрабатывается много блоков, использование памяти необходимо поддерживать на разумном уровне. Какой будет оптимальный размер словаря для n байтов данных? Типичные исходные блоки различаются по размеру от 4k до 4Mb.
Я предполагаю, что нет смысла иметь размер словаря больше, чем количество байтов для сжатия? Я также предполагаю, что если бы данные были сжаты до половины размера, не было бы смысла иметь размер словаря больше n/2 байта.
Конечно, это только предположения, и мы будем очень признательны за понимание того, почему это так или нет!
Ура
Джон
Вероятно, нет абсолютного оптимума, поскольку это зависит от ваших конкретных потребностей. Алгоритмы сжатия (хотя я не знаю конкретно о LZMA) часто позволяют настраивать параметры, чтобы найти лучший компромисс между потреблением памяти, скоростью сжатия и степенью сжатия. Вам нужно будет поиграть с этими параметрами и посмотреть, какой эффект они оказали на вашу фактическую рабочую нагрузку. Скорее всего, параметры по умолчанию довольно хороши, и настройка требуется только в том случае, если ваши требования необычны, например, если у вас жесткая память или временные ограничения.
Словарь размера m на самом деле просто память о последних видимые байты несжатых данных, ограниченные лимитом m
. Поэтому для вашего использования m: = n
будет оптимальным, чтобы максимально использовать сжатие LZMA в автономном режиме.
Если ваши блоки имеют сходство, вы может дополнительно улучшить степень сжатия, обучив LZMA с помощью образца блока размером t
, который известен как компрессору, так и декомпрессору (подробности см. в разделе «Обученное сжатие» в Интернете). В этом случае идеально подойдет m: = n + t
.