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

Фактически, в документации конкретно сказано, что «Вы можете использовать любое количество методов», но это не говорит о том, почему.

То, чего я пытаюсь добиться, - это отдельный архив «попробуй несколько методов, выбери какой лучше». Конечно, я могу вручную добиться этого с помощью небольшого количества сценариев, но, по-видимому, цепные методы сжатия должны делать именно это?

2 ответа2

5

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

Параметр -mN=X используется главным образом для указания фильтров (взятых из файла справки Windows):

Поддерживаемые фильтры:

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

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

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