Como posso obter a melhor compactação ZIP padrão?

20

Não me importo quanto tempo leva para comprimir, tudo o que quero alcançar é duas coisas:

  • A melhor taxa de compressão possível possível
  • Compatibilidade com leitores padrão, como Windows e WinZip

Portanto, sugestões como o 7-zip não serão muito úteis, a menos que o 7-zip também seja um pouco melhor na compactação ZIP padrão (em vez de usar o formato .7z muito bom).

Idealmente, estou procurando:

  • Uma recomendação de um pedaço de software
  • As configurações específicas desse software que permitem a melhor compactação absoluta
  • Algo que é grátis

Lembre-se, quanto tempo leva para compactar não é um problema!

Uma última coisa - alguns arquivos podem ser melhor compactados com configurações diferentes, como "Tamanho do Word" ou "Tamanho do Dicionário" - existe uma ferramenta que pode analisar os arquivos e escolher a taxa de compactação mais adequada ou o WinZip, 7-zip etc já faz isso?

Josh Comley
fonte

Respostas:

20

Se você deseja compatibilidade com o recurso de Pastas Zip embutido no Windows XP, está com a compactação Deflate. Eu acho que você nem pode usar o Deflate64, muito menos os métodos avançados de compactação (como LZMA, PPMD, WavPack, Bzip2 etc.) disponíveis nas versões recentes do winZip e PowerArchiver. O PowerArchiver, pelo menos, usa como padrão a extensão .zipx para esses arquivos - acho que o WinZip não está fazendo isso ainda.

O menor arquivo zip possível que o 7-Zip pode criar pode ser executado com a seguinte linha de comando:

7za a -mm=Deflate -mfb=258 -mpass=15 -r C:\Path\To\Archive.zip C:\Path\To\Files\*

Nota especial: o analisador curinga do 7-Zip não é o mesmo que a maioria dos outros no sistema. *.*significa todos os arquivos que possuem extensões. *significa todos os arquivos.

Criar arquivos .zip dessa maneira (e, presumivelmente, usar outras ferramentas que tentam criar arquivos .zip "padrão" menores) é muito, muito lento. Você provavelmente economizará tempo e espaço consideráveis ​​usando o 7-Zip ou o WinRar para criar arquivos auto-extraíveis.

afrazier
fonte
Meu erro 7z em "-m0", mas acho que "-mm" faz o mesmo com versões recentes. Também notei que, no meu caso (compactando arquivos JPG), usando "-mx9" em vez de "-mfb = 258 -mpass = 15", o resultado diferirá aleatoriamente em ± 15 bytes em média (com exceções nos anos 50) )
Mark Jeronimus
11
@ Zom-B: Você está certo, isso deveria ter sido em -mm=vez de -m0=. -m0=é usado em .7zarquivos. Além disso, o manual do 7-Zip especifica que -mx=9para arquivos Zip é equivalente a -mfb=128 -mpass=10. O que eu notei é que -mfb=258 -mpass=15é sempre muito mais lento do que -mx=9e geralmente não economiza muito espaço (ou ocasionalmente usa alguns bytes a mais). De vez em quando, economiza um pouco de espaço decente.
afrazier
"muito" mais lento no comentário anterior se traduz em um pouco mais de 3 vezes mais lento. quanto ao espaço, a opção mais lenta fornece arquivo de aprox. Tamanho de 99,885% comparado à versão mais rápida (por exemplo, -mx = 9 sem -mpass = 15). Assim, por 3x mais tempo, pode-se economizar apenas 0,115% de espaço. Portanto, a menos que esse ganho de 0,115% seja muito importante, escolha -mx = 9 em vez de -mpass = 15.
TV
8

Os melhores compressores (o formato de compactação usado pelo ZIP padrão) que eu conheço são:

Defina a comparação do tamanho do arquivo compactado do arquivo da compactação de dados usando o Zopfli (arquivado no original ):

╔══════════════╦═══════════╦═════════╦═════════╦═════════╦═════════╗
║              ║Corpus size║gzip ­-9  ║7-­zip    ║kzip     ║Zopfli   ║
╠══════════════╬═══════════╬═════════╬═════════╬═════════╬═════════╣
║Alexa-top-10k ║  693108837║128498665║125599259║125163521║123755118║
║Calgary       ║    3141622║  1017624║   980674║   978993║   974579║
║Canterbury    ║    2818976║   730732║   675163║   674321║   669933║
║enwik8        ║  100000000║ 36445248║ 35102976║ 35025767║ 34995756║
╚══════════════╩═══════════╩═════════╩═════════╩═════════╩═════════╝

Mesmo em PNGs aleatórios, o Zopfli era 0,5% melhor que o pngout . Zopfli é o menor de todos.

Anon
fonte
Como posso usar o Zopfli para compactar um conjunto de arquivos, como no comando zip original?
Panayotis
11
@Panayotis Uma pesquisa no Google por zopfli zip leva ao github.com/google/zopfli/issues/29, que fala sobre como o projeto zopfli não fará arquivos Zip diretamente, mas inclui discussão de ferramentas como o advzip do AdvanceCOMP, que pode usar o zopfli como back-end .
Anon
5

Supondo que você esteja no Windows: se você ainda deseja usar o formato ZIP, eu recomendaria o uso do utilitário de linha de comando KZIP gratuito de Ken Silverman, encontrado aqui . Copie-o dentro da pasta que contém todos os arquivos que você precisa compactar, vá para essa pasta usando o CMD e execute o seguinte comando:

kzip /r <filename of ZIP file> *.*

Como Roald sugere, é melhor incluir o diretório em que kzip.exereside a variável PATH do sistema para evitar que seja incluída no archive / zip.

Até agora, descobri que os arquivos ZIP criados com o KZIP são 10 a 20% menores que os criados por outros programas de compactação ZIP. Eles também podem ser abertos por outros softwares de arquivamento (Winzip, WinRAR, 7-zip etc.) e pelo Windows.

Isxek
fonte
5
Que tal não colocá-lo nesse diretório, mas em algum lugar no CAMINHO do seu sistema?
RD
11
Eu tinha o mesmo requisito - deve ser suportado pela funcionalidade ZIP padrão do Windows. KZIP foi o que acabei usando, pois funcionava como um campeão. Certifique-se de jogar com as opções / s / b / n para ter uma boa idéia do que funciona melhor em seu ambiente.
Goyuix
Claro! A variável PATH. Eu editei minha resposta. Obrigado Roald!
Isxek
ou apenas prefixar o comando com o caminho do executável
micsthepick 27/08
1

Script super simples para compactar todas as pastas em uma pasta para arquivos zip individuais usando o tipo de arquivo .zip e um método de compactação Deflate64.

@echo off
for /d %%X in (*) do "c:\Program Files\7-Zip\7z.exe" a "%%X.zip" "%%X\" -tzip -mx9 -mm=Deflate64
SuperMar1o
fonte
-1

É mais um limite da quantidade de memória que você precisa disponibilizar para o compressor enquanto ele faz seu trabalho. Usando o 7-Zip, eu empacotaria um arquivo com o formato .Zip, Ultra compressão, método de compressão LZMA e o tamanho padrão do dicionário de 64 MB. Se você tiver memória disponível, aumente o tamanho do dicionário, embora precise de quase 3 GB de memória disponível para compactar com um dicionário de 64 MB. O uso de um dicionário maior deve permitir que o 7-zip procure por mais correspondências e forneça melhor compactação se você puder comprar a memória. O LZMA supera o gzip (deflate / deflate64, eu acho) e o bzip2 em bons 5%, em média, até 10-12%, dependendo do conteúdo.

Não conheço uma ferramenta para encontrar o melhor tamanho de palavra / dicionário, apesar de achar que o método de compactação tem uma correlação mais forte com os dados de entrada, e a média / padrões devem ser bons caso contrário.

Darth Android
fonte
3
Estou tendo problemas com o LZMA - por exemplo, independentemente das configurações que eu experimente no 7zip, o arquivo de texto neste zip ( joshz.com/Bad.zip ) não será descompactado usando o descompactador incorporado do Windows (eu estou usando o Windows 7)
precisa
(o arquivo zip que eu ligado contém o arquivo errônea como referência, mas não foi comprimido com LZMA)
Josh Comley
@joshcomley Não consegui encontrar uma lista de esquemas de compactação suportados para a ferramenta de compactação de pasta interna do Windows. De acordo com a Wikipedia para LZMA, ele é suportado pelo WinZip e por muitas outras ferramentas de compactação em várias plataformas, então optei por segui- lo. * .zip é apenas um formato de contêiner, então não sei se existe uma compressão "oficial" que ferramentas suportarão, ou simplesmente as mais comuns (semelhante à forma como * .avi pode conter quase qualquer tipo de vídeo). Se você precisar garantir que sempre funcione, leve-o como extrator automático.
Darth Android
-3

Se você está procurando o melhor compressor para ambientes Windows , recomendo que você experimente o formato * .zip com o 'Método de compactação' LZMA 7-zip OU use os arquivos SFX 7-Zip * .7z. Os arquivos SFX têm uma sobrecarga de cerca de 130 kb em arquivos compactados .7z e vale a pena usá-los quando a diferença de tamanho entre .7z e .zip for grande.

Outro concorrente bom, mas incomum, é o NSIS, que pode usar o modo de compressão LZMA para criar exes altamente personalizáveis. Eu sei que o NSIS não é um compressor, mas uma linguagem de script, mas fiquei impressionado com o desempenho melhor que o SFX 7-zip.

Um teste que fiz com 2 arquivos -

  • AutoHotkey-H.exe (946 kb)
  • AutoHotkey.dll (1003 kb)
  • Tamanho total - 1955 kb

  • Zip 7-Zip - 794 kb
  • 7-Zip .7z SFX - 594 kb
  • Compressão Sólida NSIS LZMA - 552 kb
  • 7-Zip .7z - 461 kb

Como o nº 4 não é o que você deseja, o vencedor é o NSIS, mas por razões práticas, sugiro que o arquivo zip seja compactado com menos de 500 kbs e, se for maior, use uma ferramenta de criação de exe como o 7-Zip SFX ou NSIS (7-zip em particular, pois é fácil de configurar).

Avi
fonte
2
Os requisitos da pergunta excluem especificamente 7z e outros formatos.
21413 Bob
@ Bob Ele disse que um compressor é compatível com Windows e exe (meu # 2 e # 3) é. O 7z é apenas o número 4 que eu apontei.
Avi