Qual é a taxa máxima de compressão do gzip?


51

Qual é o tamanho maior para o qual um gzip (digamos 10kb por exemplo) pode ser descompactado?

Respostas:


91

Depende muito dos dados que estão sendo compactados. Um teste rápido com um arquivo de 1Gb cheio de zeros fornece um tamanho compactado de ~ 120Kb, para que seu arquivo de 10Kb possa potencialmente se expandir para ~ 85Mbytes.

Se os dados têm baixa redundância para começar, por exemplo, o arquivo contém arquivos de imagens em um formato compactado nativamente (gif, jpg, png, ...), então o gzip pode não adicionar mais nenhuma compactação. Para arquivos binários, como executáveis ​​de programas, você pode ver a compactação de até 2: 1, para texto sem formatação, HTML ou outras marcações de 3: 1 ou 4: 1 ou mais não é improvável. Você pode ver 10: 1 em alguns casos, mas o ~ 8700: 1 visto com um arquivo preenchido com um único símbolo é algo que você não verá fora de circunstâncias artificiais semelhantes.

Você pode verificar quantos dados resultariam da descompactação de um arquivo gzip, sem realmente gravar seu conteúdo descompactado no disco, com gunzip -c file.gz | wc --bytes- isso descompactará o arquivo, mas não armazenará os resultados, passando-os para o wcque contará o número de bytes à medida que eles passam depois descarte-os. Se o conteúdo compactado for um arquivo tar que contém muitos arquivos pequenos, você poderá perceber que é necessário muito mais espaço em disco para descompactar o arquivo completo, mas, na maioria das circunstâncias, a contagem retornada da gunzipsaída da tubulação wcserá tão precisa quanto você precisa.


Vi o HTML expandir para 10x (é claro que x3 e x4 eram os mais comuns!) ... talvez muitos dados redundantes para aqueles que estavam explodindo + 8x. Eu acho que a página em questão que estava fazendo isso era uma página de informações php.
Zombies

A marcação repetitiva, como vista na saída de phpinfo(), compacta muito bem. As informações técnicas contidas nessa saída contêm repetição mais direta do que a parte média da linguagem natural também, e a distribuição do alfabeto é provavelmente menos suave, o que poderia ajudar o estágio Huffman a obter melhores resultados.
David Spillett

Esta resposta não explica dados compactados intencionalmente maliciosos . Pode-se criar um arquivo zip malicioso em torno de 10 KB que pode se expandir para um pouco mais de 4 GB.
David Schwartz

No entanto, as bombas zip dessa escala dependem de arquivos aninhados; portanto, como um ser humano descompacta o arquivo, você notará algo estranho em pouco tempo. Eles podem ser usados ​​como um ataque DoS eficaz contra scanners automáticos (nos serviços de correio e assim por diante).
David Spillett

1
@DavidSpillett: as bombas zip aninhadas se expandem em tamanhos na faixa de petabytes. Não é disso que estou falando. Veja apenas uma única camada de uma bomba zip típica.
David Schwartz

10

Geralmente, você não obtém mais de 95% de compactação (para que os dados compactados em gps de 10kB sejam descompactados para ~ 200kB), mas existem arquivos especialmente criados que se expandem exponencialmente. Procure 42.zip, ele descompacta para alguns petabytes de dados (sem sentido).


4
A Wikipedia diz que 42.zip está "contendo cinco camadas de arquivos zip aninhados em conjuntos de 16", portanto esse não é um exemplo válido para descompactação (apenas para descompactação recursiva).
Tgr

5
De fato, o 42.zip é especificamente um perigo para as ferramentas que verificam automaticamente arquivos zip recursivamente, por exemplo, antivírus.
thomasrutter

4
Isso é zip, não gzip
BeniBela 3/17/17

8

Citado literalmente em https://stackoverflow.com/a/16794960/293815

A taxa máxima de compactação do formato de desinflar é 1032: 1. Isso ocorre porque a execução mais longa que pode ser codificada é de 258 bytes. São necessários pelo menos dois bits para cada execução (um bit para o código de comprimento e um bit para o código de distância); portanto, 4 * 258 = 1032 bytes não compactados podem ser codificados por um byte compactado.

Você pode obter mais compactação pressionando o resultado do gzip. Normalmente isso não melhora a compactação, mas por muito tempo é possível.

A propósito, a abordagem LZ77 usada pelo deflate é mais geral do que a codificação no comprimento da execução. Em vez de apenas um comprimento, é usado um par de comprimento / distância. Isso permite copiar uma string de alguma distância atrás, ou replicar um byte como no comprimento de uma distância de uma ou replicar triplos de bytes com uma distância de três, etc.


6

A taxa de compactação de qualquer algoritmo de compactação será uma função dos dados que estão sendo compactados (além do comprimento desses dados).

Aqui está uma análise em MaximumCompression ,
veja uma das amostras, como

Resumo dos testes de referência de compactação de arquivos múltiplos

Tipo de arquivo: Vários tipos de arquivo (46 no total)  
Nº de arquivos a compactar neste teste: 510  
Tamanho total do arquivo (bytes): 316.355.757 
Tamanho médio do arquivo (bytes): 620,305
Maior arquivo (bytes): 18.403.071
Arquivo menor (bytes): 3,554

4

Um arquivo enorme contendo apenas um símbolo será compactado muito bem.


4

10 MB de zeros no arquivo, compacte com gzip -9 a 10217. A proporção máxima parece estar em torno de 1000x.


1

A resposta para sua pergunta depende da entrada. Para ter uma idéia de como a compactação é feita, assista aos vídeos de seis minutos.

https://www.youtube.com/watch?v=ZdooBTdW5bM

O que você deve obter disso é que a taxa de compactação depende da frequência de cada caractere; portanto, não há taxa máxima de geração, depende da entrada; para o texto em inglês é de cerca de 65%.


1
Bem-vindo ao Super Usuário! Cite as partes essenciais da resposta nos links de referência, pois a resposta pode se tornar inválida se as páginas vinculadas forem alteradas.
DavidPostill

Seria mais correto dizer "frequência de cada string" em vez de "frequência de cada personagem"
JoelFan
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.