Por que um arquivo 7zipped é maior que o arquivo bruto? [duplicado]


37

Possível duplicata:
Por que a compactação ZIP não compacta nada?

Eu tentei compactar um arquivo .exe, mas ele ficou maior.

insira a descrição da imagem aqui

Esse é o resultado esperado?


3
Sim, é o resultado esperado. Por quê? Porque quando algo já está compactado (= usando o menor espaço possível), ele não pode ser compactado ainda mais.
Woliveirajr

4
Só para adicionar aos outros - já que esse arquivo exe é especificamente um instalador, a maior parte do conteúdo é provavelmente um arquivo zip ou cab. Você não vai obter os mesmos resultados de um arquivo exe normal (mas a maioria dos arquivos exe normais não será 145 megabytes)
Random832

11
Explicação usando apenas lógica básica: A compactação localiza para um arquivo não processado um arquivo compactado UNIQUE e para o arquivo compactado arquivo original não processado UNIQUE (não compactado). Imagine que você tem arquivos de 8 bits e deseja compactá-los em arquivos de 5 bits. Existem 256 arquivos exclusivos de 8 bits, mas apenas 32 arquivos exclusivos de 5 bits (!). Portanto, alguns arquivos de 8 bits devem ser compactados no mesmo arquivo de 5 bits (!). E se 2 arquivos brutos diferentes compactados no mesmo arquivo ZIP, qual você deseja obter após a descompactação? Para qualquer método de fechar, se existem arquivos que se tornam menores após fechando, deve existir arquivos, que se tornam maiores (!)
Ivan Kuckir

Respostas:


78

Tudo se resume a um conceito chamado entropia . Veja Wikipedia .

A idéia básica é que, se existisse uma operação de compactação que sempre poderia reduzir um arquivo, a lógica ditaria que a operação de compactação seria capaz de reduzir qualquer arquivo a 0 bytes e ainda reter todos os dados. Mas isso é um absurdo , porque sabemos que 0 bytes não pode transmitir nenhuma informação. Acabamos de provar que não pode existir um algoritmo de compactação que sempre diminua sua entrada, porque, se esse fosse o caso, qualquer informação poderia ser armazenada em 0 bytes - mas 0 bytes implica a ausência de informações, então você pode ' t simultaneamente não tem informações e todas as informações. Por isso, é um absurdo.

Devido a esse conceito teórico, todo programa de compactação usado para aumentar o tamanho de (ou, na melhor das hipóteses, manter o mesmo tamanho de) alguma entrada. Ou seja, para qualquer algoritmo de compactação que você criar ou usar, haverá determinadas entradas que serão menores e outras que não.

Os dados já compactados geralmente são um péssimo candidato para a compactação adicional, porque a maioria dos algoritmos de compactação sem perdas são baseados nos mesmos princípios teóricos. Ele é possível comprimir dados mal-comprimidas ainda mais; mas isso é menos eficiente do que simplesmente compactá-lo com o melhor algoritmo disponível a partir dos dados originais.

Por exemplo, se você tiver um arquivo de texto de 100 MB e compactá-lo usando o algoritmo Zip normal, ele poderá ser compactado para 50 MB. Se você compactar o arquivo Zip com o LZMA2, poderá reduzi-lo para 40 ou 45 MB, porque o LZMA possui uma taxa de compactação mais alta para a maioria dos dados compactáveis ​​do que o Zip. Portanto, é lógico que ele também pode compactar dados Zip, porque o Zip não absorve completamente toda a entropia deles. Mas se você eliminar completamente o contêiner Zip, poderá reduzi-lo ainda mais, compactando o texto bruto com LZMA2, produzindo algo na ordem de 30 a 35 MB (esses são apenas "números de ar" para ilustrar o conceito) .

No caso do binário que você está tentando compactar, é maior porque o formato do arquivo 7-Zip precisa criar sua própria estrutura interna e compactar os dados do executável já compactado no formato 7-Zip. Isso contém coisas como um dicionário, um cabeçalho de arquivo e assim por diante. Esses dados extras geralmente são mais do que compensados ​​pela economia de compactar os dados, mas parece que o executável que você está tentando compactar já está compactado com alguma forma de LZMA; caso contrário, provavelmente diminuiria o tamanho do executável ou aumentaria levemente, em vez de aumentá-lo em 2 MB (o que é muito).


A parte mais importante para responder a essa pergunta está no final: "Isso contém coisas como um dicionário, um cabeçalho de arquivo e assim por diante. Esses dados extras geralmente são mais do que compensados ​​pela economia de compactar os dados, mas parece que o executável que você está tentando compressa já está comprimido com alguma forma de LZMA"
jhocking

6
@jhocking: Não, a parte mais importante é no meio: "Todo programa de compressão que você usa aumenta o tamanho de ... alguma entrada." O formato de arquivo do 7zip possui um dicionário / cabeçalho de arquivo / etc, mas mesmo que o 7zip use um algoritmo que não contenha nenhuma dessas coisas, ainda estamos garantidos que algumas (de fato, a maioria) entradas terão saídas que são maior ou maior que as próprias entradas. Este é um fato básico da teoria da informação e não tem nada a ver com cabeçalhos de arquivo.
precisa saber é o seguinte

2
@ Mehrdad Claro: Basta escrever um algoritmo de "compressão" que sempre retorna a entrada original. Lá; feito. : P ... Além disso, não - qualquer algoritmo de compressão que seja um algoritmo terá alguns metadados, mesmo que seja apenas um bit no início do arquivo que indica se o arquivo está ou não compactado (0 == descompactado, 1 == compactado). Se você estiver indo para modificar o conteúdo do arquivo AT ALL , você precisa de alguns metadados. E se você estiver modificando o conteúdo, aumentará algumas entradas.
allquixotic

11
No entanto, se sua pergunta foi "Existe algum algoritmo de compactação que não aumenta o tamanho da entrada além de uma quantidade fixa de metadados", a resposta é: não sei, mas deveria ser teoricamente possível fazê-lo. Fácil, de fato. Tudo que você tem a fazer é desenvolver um formato contêiner, que pode tanto conter o arquivo original, ou um fluxo de dados comprimidos. Em seguida, ao criar o arquivo morto, tente compactar: ​​se o tamanho compactado for maior que a entrada, basta armazenar a entrada original e compactar seus metadados à frente. O tamanho do arquivo aumentará, mas se os metadados forem pequenos (continuação)
allquixotic

2
@ Mehrdad: "Existe algum algoritmo de compressão (por pior que seja) que não aumente o tamanho de nenhuma entrada? " - A resposta é não. Existem 2^(n+1)-1possíveis mensagens de tamanho n bits ou menos. Nosso algoritmo deve mapear cada um deles para uma saída única . Se mesmo um deles for mapeado para um valor com menos bits, outro valor deverá necessariamente ser mapeado para um com mais.
BlueRaja - Danny Pflughoeft 27/01

7

Os algoritmos de compactação subjacentes usados ​​em 7z são sem perdas . O que significa que você pode comprimir-descomprimir iterativamente um arquivo várias vezes. Além disso, após cada iteração, o arquivo permanecerá exatamente o mesmo.

Infelizmente, você não pode esperar que um algoritmo de compactação sem perdas seja aplicado muitas vezes com sempre um resultado positivo. Há um limite estrito que não pode pular. Grosso modo, esse limite depende de quão intimamente uma sequência de entrada agrupa dados aleatórios. Acima de tudo, algoritmos sem perdas são usados ​​para compactação de arquivos, transferências de dados HTML da Internet, backups e outras operações que esperam que um arquivo de saída seja descompactado exatamente no mesmo arquivo de entrada original.

Ao contrário da compactação sem perdas, você sempre pode esperar uma diminuição no tamanho do arquivo após a compactação com algoritmos de compactação com ou sem perdas . O lado negativo é que você não pode restaurar exatamente um arquivo original após uma única iteração de compactação-descompactação. Esses algoritmos são mais famosos pelas transmissões e armazenamento de áudio / vídeo / imagem.

bzip2 , LZMA , LZMA2 e outros algoritmos usados ​​pelo formato 7z são todos sem perdas . Portanto, haverá um limite após o qual ele não poderá mais compactar. Além disso, as imagens executáveis ​​(.exe) geralmente são arquivos altamente compactados. A ferramenta de compactação 7zip, como muitas outras, incorpora alguns metadados, que na verdade podem aumentar o arquivo de saída.

Quebra-cabeças: e se tivéssemos um algoritmo sem perdas que sempre pode diminuir o tamanho de um arquivo?

Nesse caso, você sempre verá que o arquivo compactado é menor que o arquivo de entrada. Veja um comentário abaixo por que não é possível.


5
Prova por contadição. Hipótese: Suponha que seja sempre possível compactar um arquivo com um algoritmo sem perdas. Passo 1. A compactação única torna um arquivo de saída menor pelo menos um bit. Nesse caso, após várias iterações, terminaremos com um arquivo que possui apenas dois bits. Etapa 2 A próxima iteração cria um arquivo com tamanho de 1 bit. Etapa 3 Mas os algoritmos de compactação são sem perdas, o que significa que há apenas uma descompactação válida permitida. Claramente, você não pode restaurar 2 bits originais a partir de 1 bit compactado - você terá que fazer um palpite. O último ponto viola a hipótese.
Oleksii

Você não pode garantir um algoritmo que diminua o arquivo, mas pode garantir um que não aumente o tamanho aplicando nenhuma "compressão" nesses casos. Porém, para realmente não aumentar o tamanho do arquivo, você deve indicar isso fora da banda (por exemplo, no nome do arquivo).
jeteon

@ jeteon Não sei o que você está tentando dizer.
Oleksii

Acabei de acrescentar que, como você sempre tem a opção de não compactar a entrada, pode ter um programa de compactação que não comprimirá o arquivo na pior das hipóteses. Basicamente, se você determinar que a versão compactada é maior que a versão não compactada, deixe-a. Você também teria que indicar de alguma forma que esse é o caso sem aumentar o tamanho da saída, para que o descompactador saiba que o arquivo não foi compactado. A única maneira de fazer isso sem aumentar o tamanho do arquivo, é algo como alterar o nome do arquivo.
jeteon

@ Jeteon oh, entendo. Sim, faz sentido.
Olaksii 20/08

6

Se o executável original já estiver compactado (ou contiver dados altamente compactados ou dados não compactáveis), a compactação aumentará o tamanho.


2

A maioria dos algoritmos de compactação usa o que é chamado de tabela de símbolos, basicamente apenas partes do arquivo que ele usa como elementos que PODE compactar. Obviamente, isso cria alguma sobrecarga no arquivo, mas geralmente resulta em um arquivo muito menor.

Em arquivos já compactados, ele ainda cria um conjunto de símbolos, mas há muito pouco que possa reduzir o tamanho. No seu caso, a tabela de símbolos do arquivo já compactado provavelmente tem cerca de 2 MB ou mais, se conseguir fazer alguma compactação.


0

a ideea de compressão:

o software de compactação cria uma lista de arquivos e elimina o conteúdo duplicado.

ao compactar arquivos já compactados, você poderá obter seus arquivos compactados maiores que o original.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.