Сжатие подобных файлов эффективно


11

Мне часто нужно сжимать файлы, которые очень похожи друг на друга.

В настоящее время я использую 7Zip, который сжимает файл размером 16 ГБ до 1,2 ГБ примерно за 35 минут, используя 8 ядер с настройками Ultra.

Мне кажется, что большая часть этого времени тратится на вычисление словаря для сжатия. Поскольку файлы очень похожи, фактически используемый словарь также похож.

Существует ли инструмент сжатия на базе Windows (7Zip с опцией, о которой я не знаю, или другой инструмент), который может сохранить словарь и повторно использовать этот сохраненный словарь для последующих файлов?

Есть ли лучший способ подойти к проблеме поддержания степени сжатия, аналогичной той, которая у меня есть, при этом сжатие происходит значительно быстрее?

Ответы:


5

Лемпеля-Зив-Велч (LZW) алгоритм сжатия по своей природе вычислений, с большинством сама работа будучи на самом деле вычисления словаря. Это буквально так, как работает LZW.

Сам алгоритм добавляет одну новую запись словаря для каждого следующего «символа», который он просматривает, и, таким образом, во время каждой отдельной итерации новая запись добавляется в словарь. По сути, словарь становится сжатой копией файла, и, таким образом, фактически единственное , что сжатие LZW тратит сколько-нибудь существенное время на вычисления в первую очередь.


Если бы вы использовали что-то вроде кодирования Хаффмана , повторное использование словаря было бы действительно возможным (за счет, возможно, неоптимальной степени сжатия / размера). Тем не менее, большинство современных алгоритмов и инструментов сжатия используют алгоритм LZW для эффективности и скорости (сжатие Хаффмана потребует двух проходов над данными [один для генерации дерева / таблицы Хаффмана, другой для фактического сжатия данных], тогда как LZW может быть завершен в один проход).


1
С Хаффманом и предопределенным словарем потребуется ли всего один проход? Существуют ли готовые инструменты на базе Huffman, которые поддерживают сохраненные словари?
Эрик Дж.

@EricJ. да, с предопределенным словарем это будет однопроходное кодирование. Я не знаю ни одного программного обеспечения, которое могло бы сделать это, хотя я лично написал программы, которые делают это. Хотя я еще не пробовал, этот инструмент выглядит так, как будто он может это сделать. Однако просто отметьте, что (опять же, в отличие от LZW) для декодирования битового потока, закодированного Хаффманом, вам все еще нужен исходный словарь для распаковки данных.
Прорыв

Исходя из возраста этого инструмента, я предполагаю, что он однопоточный. Я бы предположил, что использование 1 ядра, а не 8 компенсирует любую выгоду для фиксированного словаря :-( В моем сценарии возможно использование словаря на другом конце (передача больших файлов между центрами обработки данных).
Эрик Дж.

2

В отличие от алгоритма DEFLATE, LZMA 7-Zip по умолчанию использует сплошное сжатие, которое использует межфайловую избыточность. Это будет работать с настройками по умолчанию, если файлы достаточно малы.

При настройках по умолчанию 2 ГБ для размера сплошного блока файл 16 ГБ фактически сжимается как 8 отдельных блоков.

Как уже сказал @Breakthorugh, словарь генерируется на лету. Вы можете проверить это эмпирически, установив для размера блока Solid значение Solid (сжатие всех файлов одновременно) и Non-solid (сжатие каждого файла отдельно).

Увеличение размера сплошного блока на самом деле приведет к замедлению, но это может привести к гораздо лучшей степени сжатия. Например, сжатие двух одинаковых файлов приведет к увеличению размера архива почти вдвое при нестабильном сжатии.


1
В моем случае я сжимаю подобные файлы по одному, в разных случаях. В данном архиве есть только каждый 16-гигабайтный файл.
Эрик Дж.

Ах хорошо. Я неверно истолковал это. Старые архивы удаляются при создании нового? Если нет, допустимо ли хранить несколько файлов в одном архиве? Это не поможет со скоростью сжатия, но в зависимости от того, насколько файлы на самом деле похожи, это может помочь с соотношением.
Денис

1
Неважно, это не так. Обновление надежного архива занимает намного больше времени, но не приводит к лучшему сжатию.
Денис
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.