Что на самом деле делает комбинирование методов сжатия в 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 filter («Можно установить дельта-смещение в байтах. Например, для сжатия 16-битных стереофонических файлов WAV вы можете установить« 0 = Delta: 4 ». По умолчанию дельта-смещение равно 1.»)

BCJ конвертер для исполняемых файлов x86

Конвертер BCJ2 для исполняемых файлов x86 (версия 2) («BCJ2 - это конвертер ветвей для 32-битных исполняемых файлов x86 (версия 2). Он преобразует некоторые инструкции ветвления для увеличения дальнейшего сжатия».)

ARM конвертер для исполняемых файлов ARM (little-endian)

Конвертер ARMT для исполняемых файлов ARM Thumb (little-endian)

IA64 конвертер для исполняемых файлов IA-64

PPC конвертер для исполняемых файлов PowerPC (big endian)

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 к архиву archive.7z с помощью конвертера BCJ2, LZMA со словарем 8 МБ для основного потока вывода (s0) и LZMA со словарем 512 КБ для потоков вывода s1 и s2 BCJ2.

Даниэль Б
источник
«После применения первого метода сжатия размер файла не может быть значительно уменьшен». - Конечно. Я надеялся на то, что указание нескольких методов заставит его попробовать каждый файл для каждого указанного метода и выбрать наиболее эффективный. Естественно, это сделает сжатие намного медленнее.
Сёрен Куклау
2

Кажется, вы можете применить фильтры в последовательности.

Этот пост прошлого года имеет хорошее объяснение:

Что означает число после ключа -m 7-zip?

Это число позволяет вам установить порядок операций сжатия, если вы используете более одного одновременно.

Это пример из документации:

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 имеет один вход и четыре выхода. Выходной ноль идет к сжатию номер один. Выход один собирается на сжатие номер два. Выход два идет на сжатие номер три. Выход три не связан (потому что его не нужно снова сжимать).

Marcelo
источник