Що насправді поєднує методи компресії в 7z?


11

Інструмент командного рядка 7z дозволяє задавати кілька методів стиснення , наприклад:

# 7-zip archive type, strongest (9) compression, methods PPMd, BCJ2, LZMA2
$ 7z a -t7z -mx=9 -m0=PPMd -m1=BCJ2 -m2=LZMA2 myarchive.7z somefile.xml

Усі методи певним чином використовуються або принаймні визначені у метаданих:

$ 7z l -slt myarchive.7z

7-Zip [64] 9.22 beta  Copyright (c) 1999-2011 Igor Pavlov  2011-04-18

Listing archive: myarchive.
7z

--
Path = myarchive.7z
Type = 7z
Method = LZMA2 PPMD BCJ2
[..]

----------
Path = somefile.xml
[..]
Method = PPMD:o32:mem192m BCJ2 LZMA2:48m
Block = 0

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

Навіть якщо я додаю декілька файлів, таких як один XML-файл (PPMd дає найкращу компресію) та один двійковий файл (LZMA2), він все ще перераховує всі методи для обох файлів, і, здається, не переходить динамічно на файл.

Насправді в документації конкретно сказано, що "Ви можете використовувати будь-яку кількість методів", але це не говорить тому .

Я намагаюся домогтися - це архів "спробуйте кілька методів, виберіть те, що найкраще". Я, звичайно, можу досягти цього вручну за допомогою невеликого сценарію, але, мабуть, ланцюжки методів стиснення повинні робити саме це?


Зміна порядку методів стиснення має змінити розмір стисненого, навіть якщо всі методи застосовуються послідовно. Більшість стиснення зазвичай відбувається з першого застосованого методу. Результат цього зазвичай має високу ентропію, тому важко стиснути подальше. Існують винятки для транформ, які не очікують стиснення самих даних, але які кодують його більш стисливим - наприклад, послідовності 1, 2, 3, 4, 5 не мають повторення значень, але мають повторення відмінностей, тому дельта-трансформація покращує стисливість. Саме про це йдеться у відповіді Даніеля Б.
Steve314

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

Відповіді:


5

Як правило, стислі дані не можуть бути стислі (далі) ефективно. Після застосування першого методу стиснення розмір файлу не може бути значно зменшений.

Це -mN=Xв основному для визначення фільтрів (взяті з довідкового файлу Windows):

Підтримувані фільтри:

Delta Delta фільтр ("Можна встановити зміщення дельти в байтах. Наприклад, для стиснення 16-бітових стереофайлів WAV можна встановити" 0 = Delta: 4 ". За замовчуванням зміщення дельти дорівнює 1.")

Перетворювач BCJ для виконуваних файлів x86

Перетворювач BCJ2 для виконуваних файлів x86 (версія 2) ("BCJ2 - це конвертер відділення для 32-бітних виконуваних файлів x86 (версія 2). Він перетворює деякі інструкції гілки для збільшення подальшого стиснення.")

Перетворювач ARM для виконуваних файлів ARM (мало ендіан)

Перетворювач ARMT для виконавчих файлів ARM Thumb (маленький ендіан)

Конвертер IA64 для виконуваних файлів IA-64

Конвертор PPC для виконуваних файлів PowerPC (великий ендіан)

SPARC конвертер для SPARC виконуваних файлів

Також із довідкового файлу вдосконалений приклад використання декількох вихідних потоків фільтра BCJ2:

7z a -t7z archive.7z *.exe *.dll -m0=BCJ2 -m1=LZMA:d23 -m2=LZMA:d19 -m3=LZMA:d19      -mb0:1 -mb0s1:2 -mb0s2:3

додає файли * .exe та * .dll до архіву.7z за допомогою перетворювача BCJ2, LZMA зі словником 8 Мб для основного вихідного потоку (s0) та LZMA зі словником 512 КБ для вихідних потоків s1 та s2 BCJ2.


"Після застосування першого методу стиснення розмір файлу не може бути значно зменшений." - Звичайно. Я сподівався, що вказівка ​​декількох методів дозволить спробувати, за кожним файлом , кожен визначений метод і вибрати найбільш ефективний. Природно, це зробило б стиснення набагато повільніше.
Sören Kuklau

2

Здається, ви можете застосовувати фільтри в послідовності.

Ця публікація минулого року має приємне пояснення:

Що означає число після комутатора 7-zip's -m?

Це число дозволяє встановити порядок операцій стиснення, якщо ви використовуєте декілька одразу.

Це приклад з документації:

7z a a.7z *.exe *.dll -m0=BCJ2 -m1=LZMA:d25 -m2=LZMA:d19 -m3=LZMA:d19 -mb0:1 -mb0s1:2 -mb0s2:3

додає файли * .exe та * .dll для архівування a.7z за допомогою фільтра BCJ2, LZMA зі словником 32 Мб для основного вихідного потоку (s0) та LZMA зі словником 512 КБ для вихідних потоків s1 та s2 BCJ2.

Перше стиснення - найменше число, яке дорівнює нулю. У цьому прикладі нуль встановлюється BCJ2. Потім приходить одна, яка є LZMA. Два та три також є LZMA, але вони використовують різні параметри d.

Параметр -mb використовується для "прив'язування" результату від одного стиснення до входу іншого. У цьому прикладі BCJ2 має один вхід і чотири виходи. Вихідний нуль збирається на стиснення номер один. Вихід один буде стисненням номер два. Вихід другий іде на стиснення номер три. Вихід три не пов'язаний (тому що його не потрібно знову стискати).

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