Come posso ottenere la migliore compressione ZIP standard?


20

Non mi interessa quanto tempo ci vuole per comprimere, tutto quello che voglio ottenere sono due cose:

  • Il miglior rapporto di compressione possibile in assoluto
  • Compatibilità con lettori standard, come Windows e WinZip

Quindi suggerimenti come 7-zip non saranno di grande utilità, a meno che 7-zip non sia leggermente migliore con la compressione ZIP standard (rispetto all'utilizzo del suo ottimo formato .7z).

Idealmente sto cercando:

  • Una raccomandazione di un software
  • Le impostazioni particolari per quel software che consentono la migliore compressione assoluta
  • Qualcosa che è gratuito

Ricorda, quanto tempo ci vuole per comprimere non è un problema!

Un'ultima cosa - alcuni file potrebbero essere meglio compressi con impostazioni diverse, come "Dimensione parola" o "Dimensione dizionario" - esiste uno strumento in grado di analizzare i file e scegliere il rapporto di compressione più appropriato, oppure WinZip, 7-zip ecc. già farlo?

Risposte:


20

Se desideri la compatibilità con la funzionalità Cartelle zip integrata in Windows XP, sei bloccato con la compressione Deflate. Non penso che tu possa nemmeno usare Deflate64, tanto meno i metodi di compressione avanzati (come LZMA, PPMD, WavPack, Bzip2, ecc.) Disponibili nelle recenti versioni di winZip e PowerArchiver. Per impostazione predefinita, PowerArchiver utilizza l'estensione .zipx per quei file: non credo che WinZip lo stia ancora facendo.

Il file zip più piccolo possibile che 7-Zip può creare può essere eseguito con la seguente riga di comando:

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

Di particolare nota: il parser jolly di 7-Zip non è lo stesso della maggior parte degli altri sul sistema. *.*indica tutti i file con estensioni. *indica tutti i file.

La creazione di file .zip in questo modo (e, presumibilmente, l'utilizzo di altri strumenti che tentano di creare file .zip "standard" più piccoli) è molto, molto lenta. Molto probabilmente risparmieresti tempo e spazio considerevoli usando 7-Zip o WinRar per creare archivi autoestraenti.


Il mio errore 7z su "-m0" ma immagino che "-mm" faccia lo stesso con le versioni recenti. Ho anche notato che, nel mio caso (comprimendo i file JPG), usando "-mx9" invece di "-mfb = 258 -mpass = 15" il risultato differirà casualmente di ± 15 byte in media (con eccezioni che vanno tra ± 50s )
Mark Jeronimus,

1
@ Zom-B: hai ragione, avrebbe dovuto essere -mm=invece di -m0=. -m0=viene utilizzato negli .7zarchivi. Inoltre, il manuale di 7-Zip specifica che -mx=9per gli archivi Zip è equivalente -mfb=128 -mpass=10. Quello che ho notato è che -mfb=258 -mpass=15è sempre molto più lento di -mx=9e spesso non risparmia molto spazio (o occasionalmente usa qualche byte in più). Ogni tanto risparmia un po 'di spazio decente.
Afrazier

"molto" più lentamente nel commento precedente si traduce in poco più di 3 volte più lentamente. per quanto riguarda lo spazio, l'opzione più lenta fornisce un archivio di ca. Dimensione del 99,885% rispetto alla versione più veloce (ovvero -mx = 9 senza -mpass = 15). Quindi, per 3 volte di più si può risparmiare solo lo 0,115% di spazio. Quindi, a meno che quel guadagno dello 0,115% sia molto importante, scegli -mx = 9 invece di -mpass = 15.
TV

8

I migliori compressori deflate (il formato di compressione utilizzato dai ZIP standard) che conosco sono:

Sgonfia il confronto delle dimensioni dei file compressi dalla compressione dei dati utilizzando Zopfli (archiviato dall'originale ):

╔══════════════╦═══════════╦═════════╦═════════╦═════════╦═════════╗
║              ║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║
╚══════════════╩═══════════╩═════════╩═════════╩═════════╩═════════╝

Anche su PNG casuali Zopfli è stato in grado di essere migliore dello 0,5% rispetto a pngout . Zopfli rende il più piccolo di tutti.


Come posso usare Zopfli per comprimere un set di file, come con il comando zip originale?
Panayotis,

1
@Panayotis Una ricerca su Google di zopfli zip porta a github.com/google/zopfli/issues/29 che parla di come il progetto zopfli non farà direttamente i file zip ma include la discussione di strumenti come Advzip di AdvanceCOMP che possono usare zopfli come backend .
Anon,

5

Supponendo che tu sia su Windows: se vuoi ancora usare il formato ZIP, ti consiglierei di usare l'utilità da riga di comando KZIP gratuita di Ken Silverman, che trovi qui . Copialo nella cartella contenente tutti i file che devi comprimere, vai a quella cartella usando CMD ed esegui il seguente comando:

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

Come suggerisce Roald, è meglio includere la directory in cui kzip.exerisiede la variabile PATH del sistema per evitare che venga inclusa nel file archivio / Zip.

Finora ho scoperto che i file ZIP creati con KZIP sono circa il 10-20% più piccoli di quelli creati da altri programmi di compressione ZIP. Sono inoltre completamente apribili da altri software di archivio (Winzip, WinRAR, 7-zip, ecc.) E da Windows.


5
Che ne dici di non inserirlo in quella directory ma da qualche parte sul PERCORSO del tuo sistema?
RD

1
Avevo lo stesso requisito - deve essere supportato dalla funzionalità ZIP standard di Windows. KZIP è quello che ho finito usando come ha funzionato come un campione. Assicurati di giocare con le opzioni / s / b / n per avere una buona idea di ciò che funziona meglio nel tuo ambiente.
Goyuix,

Ovviamente! La variabile PATH. Ho modificato la mia risposta. Grazie Roald!
Isxek,

o semplicemente prefissa il comando con il percorso dell'eseguibile
micsthepick il

1

Script super semplice per comprimere tutte le cartelle in una cartella in singoli file zip utilizzando il tipo di file .zip e un metodo di compressione Deflate64.

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

-1

È più un limite di quanta memoria devi mettere a disposizione del compressore mentre sta facendo il suo lavoro. Usando 7-Zip, impacchetterei un archivio con il formato .Zip, la compressione Ultra, il metodo di compressione LZMA e la dimensione predefinita del dizionario da 64 MB. Se hai la memoria disponibile, aumenta le dimensioni del dizionario, sebbene ti serva quasi 3 GB di memoria disponibile per comprimere con un dizionario da 64 MB. L'uso di un dizionario più grande dovrebbe consentire a 7-zip di cercare più partite e fornire una migliore compressione se puoi permetterti la memoria. LZMA batte sia gzip (deflate / deflate64, credo) sia bzip2 di un buon 5% in media, fino al 10-12% a seconda del contenuto.

Non conosco uno strumento per trovare la migliore dimensione di parola / dizionario, anche se penso che scoprirai che il metodo di compressione ha una più forte correlazione con i dati di input, e altrimenti la media / valori predefiniti dovrebbero essere buoni.


3
Ho qualche problema con LZMA - ad esempio, indipendentemente dalle impostazioni che provo in 7zip, il file di testo in questo zip ( joshz.com/Bad.zip ) non si decomprimerà utilizzando il decompressore incorporato di Windows (sto usando Windows 7).
Josh Comley,

(il file zip che ho collegato contiene il file errato come riferimento, ma non è stato compresso con LZMA)
Josh Comley,

@joshcomley Non sono riuscito a trovare un elenco di schemi di compressione supportati per lo strumento di compressione delle cartelle di Windows incorporato. Secondo Wikipedia per LZMA, è supportato da WinZip e molti altri strumenti di compressione su varie piattaforme, quindi ho scelto di seguirlo. * .zip è solo un formato contenitore, quindi non so se esiste una compressione "ufficiale" che gli strumenti supporteranno, o semplicemente quelli comuni (simile a come * .avi può contenere quasi ogni tipo di video). Se è necessario assicurarsi che funzioni sempre, imballarlo come autoestraente.
Darth Android,

-3

Se stai cercando il miglior compressore per ambienti Windows , ti consiglio di provare il formato * .zip con il "Metodo di compressione" LZMA a 7 zip O utilizzare gli archivi SFX a 7 zip * .7z. Gli archivi SFX hanno un sovraccarico di circa 130 kb su .7z file compressi e vale la pena usarli quando la differenza di dimensioni tra .7z e .zip è grande.

Un altro concorrente buono ma non comune è il NSIS che può usare la modalità di compressione LZMA per creare ex altamente personalizzabili. So che NSIS non è un compressore ma un linguaggio di scripting, ma sono rimasto colpito dal fatto che ha funzionato meglio di SFX a 7 zip.

Un test che ho fatto con 2 file -

  • AutoHotkey-H.exe (946 kb)
  • AutoHotkey.dll (1003 kb)
  • Dimensione totale - 1955 kb

  • .Zip a 7 zip - 794 kb
  • SFX a 7 zip .7z - 594 kb
  • Compressione solida NSIS LZMA - 552 kb
  • 7-Zip .7z - 461 kb

Dato che il numero 4 non è quello che vuoi, il chiaro vincitore è NSIS ma per motivi pratici, suggerisco di usare .zip se la dimensione compressa è inferiore a 500 kbs e, se più grande, vai con uno strumento di creazione exe come 7-Zip SFX o NSIS (7-zip in particolare in quanto è facile da configurare).


2
I requisiti nella domanda escludono specificamente 7z e altri formati.
Bob,

@Bob Ha detto che un compressore è compatibile con Windows ed exe (i miei # 2 e # 3) lo è. Il 7z è solo il n. 4 che ho sottolineato.
Avi,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.