O que a combinação de métodos de compressão em 7z realmente faz?

10

A ferramenta de linha de comando 7z permite especificar vários métodos de compactação , por exemplo:

# 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

Todos os métodos são usados de alguma forma, ou pelo menos especificados nos metadados:

$ 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

Ele não parece executar o arquivo pelos três métodos, escolhendo o melhor. Pelo contrário, aparentemente sempre escolhe o primeiro, pois alterar a ordem do método afeta significativamente o tamanho do arquivo.

Mesmo se eu adicionar vários arquivos, como um arquivo XML (PPMd produz melhor compactação) e um arquivo binário (LZMA2), ele ainda lista todos os métodos para ambos os arquivos, e não parece mudar dinamicamente por arquivo.

Na verdade, a documentação diz especificamente que "Você pode usar qualquer número de métodos", mas não diz por que .

O que estou tentando alcançar é um arquivo por arquivo "tente vários métodos, escolha o que for melhor". É claro que posso conseguir isso manualmente com um pequeno script, mas presumivelmente, os métodos de compressão de encadeamento devem fazer exatamente isso?

    
por Sören Kuklau 04.08.2014 / 10:21

2 respostas

5

Geralmente, os dados compactados não podem ser compactados (ainda mais) com eficiência. Após o primeiro método de compactação ter sido aplicado, o tamanho do arquivo não pode ser diminuído significativamente.

O -mN=X é principalmente para especificar filtros (obtidos do arquivo de ajuda do Windows):

Supported filters:

Delta Delta filter (“It's possible to set delta offset in bytes. For example, to compress 16-bit stereo WAV files, you can set "0=Delta:4". Default delta offset is 1.”)

BCJ converter for x86 executables

BCJ2 converter for x86 executables (version 2) (“BCJ2 is a Branch converter for 32-bit x86 executables (version 2). It converts some branch instructions for increasing further compression.”)

ARM converter for ARM (little endian) executables

ARMT converter for ARM Thumb (little endian) executables

IA64 converter for IA-64 executables

PPC converter for PowerPC (big endian) executables

SPARC converter for SPARC executables

Também do arquivo de ajuda, um exemplo avançado aproveitando vários fluxos de saída do filtro 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

adds *.exe and *.dll files to archive archive.7z using BCJ2 converter, LZMA with 8 MB dictionary for main output stream (s0), and LZMA with 512 KB dictionary for s1 and s2 output streams of BCJ2.

    
por 07.08.2014 / 22:56
2

Parece que você pode aplicar filtros em uma sequência.

Esta postagem do ano passado tem uma boa explicação:

O que faz o número após 7-zip's - m switch significa?

That number lets you set the order of the compression operations if you are using more than one at once.

This is an example from the documentation:

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

adds *.exe and *.dll files to archive a.7z using BCJ2 filter, LZMA with 32 MB dictionary for main output stream (s0), and LZMA with 512 KB dictionary for s1 and s2 output streams of BCJ2.

The first compression is the lowest number, which is zero. In this example, zero is set to BCJ2. Then comes one, which is LZMA. Two and three are also LZMA, but they are using different d parameters.

The -mb option is used to "bind" the output from one compression to the input of another one. In this example, BCJ2 has one input and four outputs. Output zero is going to compression number one. Output one is going to compression number two. Output two goes to compression number three. Output three is not bound (because it does not need to be compressed again).

    
por 07.08.2014 / 23:10