O que realmente combina os métodos de compressão no 7z?

11

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 maneira, 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 aparecer para executar o arquivo através de todos os três métodos, escolher 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 (o PPMd produz a melhor compactação) e um arquivo binário (o LZMA2), ele ainda lista todos os métodos dos dois arquivos e não parece alternar dinamicamente por arquivo.

De fato, 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 obter é um arquivo por arquivo "tente vários métodos, escolha o que for melhor". É claro que posso conseguir isso manualmente com um pouco de script, mas presumivelmente, os métodos de compactação em cadeia devem fazer exatamente isso?

Sören Kuklau
fonte
Alterar a ordem dos métodos de compactação deve alterar o tamanho compactado, mesmo que todos os métodos sejam aplicados em sequência. A maior parte da compactação geralmente vem do primeiro método aplicado. O resultado disso normalmente tem alta entropia, por isso é difícil compactar ainda mais. Há exceções para transformações que não devem compactar os dados, mas que os codificam para serem mais compressíveis - por exemplo, a sequência 1, 2, 3, 4, 5 não possui repetição de valores, mas repetição de diferenças, portanto uma transformação delta melhora a compressibilidade. É disso que se trata a resposta de Daniel B.
Steve314
Na verdade, eu não sei o que o 7zip faz - apenas comentar sua lógica "como alterar a ordem do método afeta significativamente o tamanho do arquivo".
Steve314

Respostas:

5

Geralmente, os dados compactados não podem ser compactados (além) com eficiência. Após a aplicação do primeiro método de compactação, o tamanho do arquivo não pode ser reduzido significativamente.

Isto -mN=Xé principalmente para especificar filtros (extraídos do arquivo de ajuda do Windows):

Filtros suportados:

Filtro Delta Delta ("É possível definir o deslocamento delta em bytes. Por exemplo, para compactar arquivos WAV estéreo de 16 bits, você pode definir" 0 = Delta: 4 ". O deslocamento delta padrão é 1.")

Conversor BCJ para executáveis ​​x86

Conversor BCJ2 para executáveis ​​x86 (versão 2) ("BCJ2 é um conversor de ramificação para executáveis ​​x86 de 32 bits (versão 2). Ele converte algumas instruções de ramificação para aumentar ainda mais a compactação.")

Conversor ARM para executáveis ​​ARM (little endian)

Conversor ARMT para executáveis ​​ARM Thumb (little endian)

Conversor IA64 para executáveis ​​IA-64

Conversor PPC para executáveis ​​do PowerPC (big endian)

Conversor SPARC para executáveis ​​SPARC

Também do arquivo de ajuda, um exemplo avançado que utiliza 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

adiciona arquivos * .exe e * .dll para arquivar archive.7z usando o conversor BCJ2, o LZMA com dicionário de 8 MB para o fluxo de saída principal (s0) e o LZMA com dicionário de 512 KB para os fluxos de saída s1 e s2 do BCJ2.

Daniel B
fonte
"Depois que o primeiro método de compactação foi aplicado, o tamanho do arquivo não pode ser reduzido significativamente." - Certo. Minha esperança era que a especificação de vários métodos o fizesse tentar, por arquivo , cada método especificado e escolher o mais eficiente. Naturalmente, isso tornaria a compactação muito mais lenta.
Sören Kuklau
2

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

Este post do ano passado tem uma boa explicação:

O que significa o número após a opção -m do 7-zip?

Esse número permite definir a ordem das operações de compactação se você estiver usando mais de uma de uma vez.

Este é um exemplo da documentação:

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

adiciona arquivos * .exe e * .dll para arquivar a.7z usando o filtro BCJ2, o LZMA com dicionário de 32 MB para o fluxo de saída principal (s0) e o LZMA com dicionário de 512 KB para os fluxos de saída s1 e s2 do BCJ2.

A primeira compactação é o número mais baixo, que é zero. Neste exemplo, zero é definido como BCJ2. Depois vem um, que é o LZMA. Dois e três também são LZMA, mas estão usando parâmetros d diferentes.

A opção -mb é usada para "vincular" a saída de uma compactação à entrada de outra. Neste exemplo, o BCJ2 possui uma entrada e quatro saídas. A saída zero vai para a compressão número um. A saída um vai para a compressão número dois. A saída dois vai para a compactação número três. A saída três não está vinculada (porque não precisa ser compactada novamente).

Marcelo
fonte