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.