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


Qual é o maior tamanho que um gzip (digamos 10kb por exemplo) pode ser descomprimido?


41


origem




Respostas:


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

Se os dados tiverem baixa redundância para começar, por exemplo, o arquivo contém arquivos de imagens em um formato que é compactado nativamente (gif, jpg, png, ...), então o gzip pode não adicionar mais compressão alguma. Para arquivos binários como programas executáveis, você pode ver até 2: 1 de compressão, para texto simples, HTML ou outras marcações 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 vai ver fora de circunstâncias similarmente artificiais.

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 wc que contará o número de bytes conforme eles passam e, em seguida, os descartará. Se o conteúdo compactado for um arquivo tar contendo muitos arquivos pequenos, você poderá perceber que é necessário mais espaço em disco para descompactar o archive completo, mas, na maioria das circunstâncias, a contagem retornou do piping gunzip saída através wc vai ser tão preciso quanto você precisa.


84



Eu vi HTML expandir para 10x (é claro x3 e x4 foi o mais comum!) .... 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 do php. - Zombies
Marcação repetitiva, como visto na saída de phpinfo(), comprime muito bem. As informações técnicas nessa saída contêm mais repetição direta do que a média da linguagem natural também, e a distribuição do alfabeto é provavelmente menos suave, o que poderia ajudar o palco de Huffman a obter melhores resultados. - David Spillett
Esta resposta não responde por intencionalmente malicioso dados comprimidos. Pode-se criar um arquivo zip malicioso em torno de 10KB, que pode se expandir para pouco mais de 4GB. - David Schwartz
Zip-bombas dessa escala dependem de arquivos aninhados, então, como um humano descompactando o arquivo, você notaria algo estranho em pouco tempo. Eles podem ser usados ​​como um ataque eficaz de DoS contra scanners automatizados (em serviços de email e assim por diante). - David Spillett
@DavidSpillett: As bombas zip aninhadas se expandem em tamanhos no leque de petabytes. Não é disso que estou falando. Veja apenas uma única camada de uma típica bomba zip. - David Schwartz


Geralmente, você não obtém mais de 95% de compactação (para que os dados de 10kB gzipped sejam descompactados para ~ 200kB), mas há arquivos especialmente criados que se expandem exponencialmente. Olhe para 42.zip, descomprime para poucos petabytes de dados (sem sentido).


10



Wikipedia diz 42.zip "contém cinco camadas de arquivos zip aninhados em conjuntos de 16", portanto, esse não é um exemplo válido de descompactação (apenas para descompactação recursiva). - Tgr
De fato, o 42.zip é especificamente um perigo para as ferramentas que automaticamente examinam os arquivos zip recursivamente, por exemplo, os scanners de vírus. - thomasrutter
Isso é zip, não gzip - BeniBela


Citada textualmente de https://stackoverflow.com/a/16794960/293815

A taxa de compressão máxima do formato de desinfecção é de 1032: 1. Isso ocorre porque a execução mais longa que pode ser codificada é de 258 bytes. Pelo menos dois bits são necessários 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 compressão gzipando o resultado do gzip. Normalmente, isso não melhora a compactação, mas para execuções muito longas pode.

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


6





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

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

Resumo dos vários testes de benchmark de compactação de arquivos

Tipo de arquivo: vários tipos de arquivo (46 no total)
Número de arquivos para 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

5





Um arquivo enorme contendo apenas um símbolo irá compactar muito bem.


4





10 MB de zeros no arquivo, compactar com gzip -9 a 10217. Portanto, a taxa máxima parece ser em torno de 1000x.


3





A resposta para sua pergunta depende da entrada. Para ter uma ideia de como a compressão é feita, assista a vídeos de seis minutos.

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

O que você deve obter é que a taxa de compressão depende da freqüência de cada personagem, 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 superusuário! Por favor, cite as partes essenciais da resposta do (s) link (s) de referência, pois a resposta pode se tornar inválida se a (s) página (s) vinculada (s) mudar (em). - DavidPostill♦
Seria mais correto dizer "frequência de cada string" em vez de "frequência de cada caractere" - JoelFan