Komprimační program 7-ZIP

22. 9. 2004
Doba čtení: 5 minut

Sdílet

Ilustrační obrázek
Autor: Depositphotos – stori
Ilustrační obrázek
Ačkoliv je program 7zip je distribuován jako Open Source(TM), nebyl dosud přeportován do UNIXu. Nedávno se však ve FreeBSD portech objevila jeho Unixová verze, a tak jsem se na něj blíže podíval.

7zip

Domovská stránka programu je www.7-zip.org, vlastní projekt je umístěn na Source Forge, kde najdete i jeho portabilní verzi.

7zip je zajímavý ze dvou hledisek:

  1. Umí velmi dobře komprimovat data. Algoritmus LZMA dosahuje nejvyššího mně známého kompresního poměru.
  2. Je to všeuměl, který si kromě vlastního formátu 7Z umí poradit i se soubory RAR, CAB, ZIP, GZIP, TAR, BZIP2, RPM, DEB, CPIO, ARJ. Formáty RAR, CAB, ARJ, DEB, RPM umí však pouze rozbalovat.

Použité algoritmy

Nativní algoritmus 7-zipu je modifikace Lempel-Ziv metody nazývaná LZMA. Program implementuje i metody převzaté z jiných programů. Za zmínku stojí modifikace metody PPMd převzaté ze stejnojmenného programu. Tato metoda má poskytovat výborné výsledky při komprimaci textových souborů.

Druhá metoda, která stojí za zmínku, je Deflate64. Deflate64 je vylepšením metody Deflate, která je známá především z rodiny komprimačních programů odvozených od PKZIPu 2.0. Tato metoda se používá jako preferovaná u zip archivů s rozšířením zip64, v dnešní době se však ona ani takto rozšířené archivy prakticky nepoužívají. 7zip tak nabízí jediný možný prostředek k jejímu otestování v prostředí UNIXu.

Třetí věcí, která mne zaujala, je preprocesor. Každý kvalitnější komprimační program, např. rar nebo ace, obsahuje několik preprocesorů, které po auto detekci vstupního formátu data upravují do lépe komprimovatelného tvaru. Obyklé jsou preprocesory pro obrazová, zvuková či textová data. 7-zip nic takového sice nemá, ale má dva preprocesory pro komprimaci Intel binárek. Jednoduší verze BCJ upravuje CALL a JUMP instrukce, rožšířená verze BCJ2 přidává navíc instrukci JCC.

Test č. 1 – zdrojové texty

Při komprimaci zdrojových textů je nejdůležitější maximalizovat kompresní poměr, abychom následně minimalizovali počet přenesených dat po síti a výdaje s tím spojené. Doba komprese v tomto případě nehraje moc velkou roli. Uživatelé však musí mít možnost dekomprimovat námi zabalené archivy na různých platformách. Open Source komprimační program je v tomto případě holou nutností.

Uživatelé jsou ale často velmi konzervativní. Ze své zkušenosti mohu potvrdit, že při nabídce jednoho programu v několika formátech (gzip, rzip, bzip2) si vybírají tradiční gzip, i když bzip2 je dnes nainstalován na každém Linuxu. Poté, co jsem nabídku gzipů zrušil, počet downloadů se snížil a zvýšil se až poté, co jsem tam gzipy vrátil.

postgresql 7.4.1 tarball 36444160 bajtu

Tabulka č. 596
program čas (sec) spotřeba paměti v KB výsledná velikost
gzip –6 default 37 860 8238797 128%
gzip –7 46 856 8200570 128%
7z -tzip -mm=Deflate64 166 4076 7100731 111
7z -mx=1 fast 79 3588 6936458 108
bzip2 –9 default 101 7200 6407883 100%
rzip –6 default 89 77828 5905714 92%
7z -m0=PPMd:mem=24 65 20472 5743255 89
7z -m0=PPMd:mem=25 64 36940 5799877 90
7z -m0=PPMd:mem=26 65 69740 5841941 91
rar -m4 -md4096 90 52152 5374120 84%
7z -mx=5 default 524 28024 4746513 74%
7z -mx=7 max 929 86608 4553791 71
7z -mx=9 extreme 4569 343MB 4424120 69

Přepínač –7 je poslední u gzipu, který se ještě vyplatí. Vyšší stupně komprese podstatně prodlouží čas komprimování, a tak je lepší použít místo gzipu bzip2, který to zvládne lépe a rychleji. U Bzipu2 jsou nižší stupně komprese výhodné jen při nedostatku operační paměti. 7zip dosahuje o stupeň lepšího komprimačního poměru ve srovnání s RARem, je však o dost pomalejší. Pomalost 7zip je pravděpodobně hlavním důvodem, proč je ve warez komunitě doposud preferován Rar3. 7zip v režimu fast se nevyplatí, místo toho je lepší použít bzip2 a nekomplikovat si život s 7z formátem. Zajímavé je, že čas metody PPMd je konstantní a nezávisí na nastavené velikosti dictionary size. Metoda Deflate64 ukázala, že ostatním metodám dnes již nestačí.

Test č. 2 – filesystém dump

Filesystémové dumpy se obvykle komprimují přes pipe. Pokud program tuto možnost neposkytuje (7z, rzip), stává se pro tento účel nepoužitelným. Komprimační program navíc musí být natolik rychlý, aby se na něj nemuselo při zálohování zbytečně čekat. V praxi se zálohování optimalizuje za účelem dosažení co nejkratší zálohovací doby, nikoliv minimálního objemu uložených dat. Komprimace se provádí především proto, aby se data vešla na požadovaný nosič. Různé druhy páskových zálohovacích zařízení umějí provádět vlastní kompresi. Kompresní poměr bývá 2:1.

Nekomprimovaná velikost 55521280

Tabulka č. 597
program čas (sec) spotřeba paměti v KB výsledná velikost
gzip –7 111 884 20420529 114
bzip2 –9 148 7184 17924456 100
rzip –6 132 96464 15877056 89
7z -m0=PPMd:mem=26 282 69720 15283004 85
rar -m4 -md4096 197 43928 13975960 78
7z -mx=5 500 28000 12778160 71

Test č. 3 – pgsql databázový dump

Tato databáze neobsahovala žádné položky typu řetězec. Soubor obsahoval pouze čísla v ascii kódování. Nekomprimovaná velikost 98072648 Bajtů.

Jak probíhá zálohování databází v praxi

Výše zmíněná databáze o cca dvou milionech řádků zabírá na disku 189 MB. Její dump má však velikost pouze 98 MB. Dumpovat indexy není potřeba, ty lze znovu jednoduše vytvořit po importu dat. Každá řádka navíc obsahuje kromě vlastních dat také interní databázové struktury, jejichž overhead je značný, zejména pokud ukládáme krátké řádky. Numerické řádky jsou krátké. Databáze navíc obsahují transakční žurnály a temporary tablespace, které se rovněž nedumpují. V našem případě do velikosti nejsou započítány. Jejich velikost je minimálně dalších 50 MB. Takže provedením dumpu zmenšíme objem dat v poměru o něco větším než 2:1. Tato data se pak zakomprimují, což jak dále uvidíte, jde velmi snadno. Obyčejný gzip je smrskne v poměru 10:1. Já doporučuji používat k jejich kompresi rar. Kromě lepšího komprimačního poměru 20:1 umí přidávat do archivu media recovery data, která se používají v případě chyb při čtení. Výsledkem akce jsou data slisovaná v poměru více než 40:1. Tento objem dat lze již bez problémů napálit na DVD. Právě jste si přečetli další díl mého seriálu o databázích mírně ztrátově zkomprimovaný.

prace_s_linuxem_tip

Tabulka č. 598
program čas (sec) spotřeba paměti v KB výsledná velikost komp. poměr
gzip –7 28 824 7475305 13.11
rzip –6 84 137896 6766400 14.49
7z -mx=5 514 27864 6002845 16.33
7z -mx=7 1047 27864 5748889 17.05
7z -m0=PPMd:mem=26 89 52484 4966140 19.74
bzip2 –9 64 86332 4919690 19.93
rar -m4 -md4096 142 51884 4511392 21.73

Tady se již PPMd algoritmus hezky vytáhl. Osobně jsem byl překvapen těsným rozdílem bzip2/rar, který bývá většinou mnohem větší.

Dekomprese

Tabulka č. 599
program čas paměť
rar 53 25284
7z 20 5224
bzip2 21 4264

Závěr

Ve warez komunitě 7zip moc velký úspěch nezaznamenal. Uvidíme, jak si povede v Open Source komunitě. Komprimační poměr má výborný. Bohužel je ve srovnání s bzipem2 při komprimaci o dost pomalejší. Jak se říká, není růže bez trní. Své místo by však určitě našel při distribuci velkých balíků, jako např: Open Office, Mozilla, Firebird, Linux kernel, protože tam doba komprese není tak podstatná a v dekompresi se bzipu2 vyrovná.

Autor článku