10

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

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

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

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

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

2 ответа2

4

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

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


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

2

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .