Ефективно стискайте подібні файли


11

У мене часто виникає потреба стискати файли, дуже схожі між собою.

В даний час я використовую 7Zip, який стискає файл 16 Гб до 1,2 ГБ приблизно за 35 хвилин, використовуючи 8 ядер із налаштуваннями Ultra.

Мені здається, що значна частина цього часу витрачається на обчислення словника, який використовується для стиснення. Оскільки файли дуже схожі, фактично використаний словник, ймовірно, також схожий.

Чи існує інструмент стиснення на базі Windows (7Zip з опцією, про яку я не знаю, або інший інструмент), який може зберегти словник і використовувати повторно збережений словник для наступних файлів?

Чи є кращий спосіб підійти до проблеми підтримки коефіцієнта стиснення, аналогічного тому, що я маю, стискаючи при цьому значно швидше?

Відповіді:


5

Лемпеля-Зів-Велч (LZW) алгоритм стиснення за своєю природою обчислень, з більшістю сама робота будучи на самому справі обчислення словника. Це буквально так, як працює LZW.

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


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


1
З Хаффманом та заздалегідь заданим словником, чи потрібен був би один пропуск? Чи є якісь інструменти на основі Хаффмана, які підтримують збережені словники?
Ерік Дж.

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

Виходячи з віку цього інструменту, я здогадуюсь, що він є однопоточним. Я б припустив, що використання 1 ядра, а не 8 компенсує будь-яку користь фіксованому словнику :-( Наявність словника на іншому кінці можливо в моєму сценарії (передача великих файлів між центрами обробки даних).
Ерік Дж.

2

На відміну від алгоритму DEFLATE, LZMA 7-Zip використовує тверду компресію за замовчуванням, що використовує переваги надмірності файлів. Це працюватиме з налаштуваннями за замовчуванням до тих пір, поки файли будуть досить маленькими.

Якщо налаштування за замовчуванням - 2 ГБ для твердого блоку , файл 16 ГБ насправді стискається у вигляді 8 окремих фрагментів.

Як вже говорив @Breakthorugh, словник генерується з льоту. Ви можете перевірити це емпірично, встановивши для розміру Solid Block значення Solid (стиснути всі файли одразу) та Non-solid (стиснути кожен файл окремо).

Збільшення розміру твердого блоку фактично призведе до уповільнення, але це може призвести до набагато кращого коефіцієнта стиснення. Наприклад, стиснення двох однакових файлів призведе до того, що архів буде майже вдвічі більшим при непомітному стисненні.


1
У моєму випадку я стискаю подібні файли один за одним, по-різному. У даному архіві є лише кожен файл розміром 16 ГБ.
Ерік Дж.

А, добре. Я неправильно трактував це. Чи видаляються старі архіви, коли створюється новий? Якщо ні, чи допустимо зберігати кілька файлів в одному архіві? Це не допоможе зі швидкістю стиснення, але залежно від того, наскільки схожі файли насправді, це може допомогти у співвідношенні.
Денніс

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