Komprimační program RZIP

27. 5. 2004
Doba čtení: 4 minuty

Sdílet

Nejpoužívanější komprimační programy v Unixu jsou gzip a bzip2. Program rzip je vhodným kandidátem pro rozšíření této kolekce.

Program RZIP vytvořil Andrew Tridgel, který je také autorem či spoluautorem známých programů jako samba, rsync, ccache, tdb. Jeho cílem bylo vytvořit komprimační program vhodný pro kompresi distribučních tarballů.

Jak pracuje komprimační program

Komprimační programy pracují zhruba takto:

  1. načítají vstupní data do bufferu (obvykle cyklického)
  2. v bufferu se různými způsoby snaží vyhledat podobné posloupnosti dat
  3. výstupní data jsou kódována pomocí odkazů na data v bufferu

Stupeň dosažené komprese závisí kromě efektivity vyhledávacích a kódovacích algoritmů také na velikosti bufferu. Čím je buffer větší, tím je tu větší šance, že v něm najdeme data podobná těm, která se snažíme zakódovat. Nejlepší by bylo, kdyby byl buffer stejně velký jako vstupní data. Nemohlo by se tak stát, že bychom zakódovali data na výstupu neefektivně jen proto, že nám podobná data již z bufferu zmizela.

Co je na rzipu zajímavého

V praxi se ovšem takto veliký buffer nepoužívá. Zabíral by příliš mnoho paměti a jeho prohledávání by trvalo příliš dlouho. Velikost bufferu je proto kompromisem mezi CPU a paměťovou náročností a stupněm dosažené komprese. Program gzip používá buffer o velikosti 32 kB, program bzip2 900 kB, programy Ace a Rar používají až 4 MB. Nejzajímavější na rzipu je, že jeho buffer je veliký ne 900 kB nebo 4 MB, ale celých 900 MB. Druhá zajímavá věc na rzipu je, že používá bzip2 knihovnu jako svůj komprimační backend. Zjednodušeně řečeno, rzip je preprocesor pro bzip2.

Instalace

RZIP 2.0 je k dispozici na rzip.samba.org a je šířen pod GPL licencí. Rzip je neuvěřitelně malý, pouhých 40 kB, a neuvěřitelně jednoduchý. Jak již bylo napsáno, vyžaduje ke své kompilaci a činnosti knihovnu libbz2. Příkazová řádka rzipu je téměř shodná s bzipem 2. Rzip však na rozdíl od bzipu neumí komprimovat data z roury, což snižuje jeho praktickou využitelnost při komprimování záloh.

Provedl jsem testy gzipu, rzipu 2, bzipu2 a raru 3.30. Zajímala mne rychlost komprese, spotřeba paměti a výsledná velikost.

Test č.1

Testování probíhalo na Postgresql-7.4.1-base tarballu o nekomprimované velikosti 36 444 160 B.

bzip2

Tabulka č. 563
přepínač paměť čas výsledná velikost
 –2 2560K 83.34s 6792414
 –6 5696K 95.16s 6469659
 –9 7172K 94.28s 6407883 default
dekomprese 4256K 25.26s  –

gzip

Spotřeba paměti je téměř konstantní – 888 K.

Tabulka č. 564
přepínač čas velikost
 –1 12.32s 9977624
 –2 13.46s 9628126
 –3 17.00s 9359419
 –4 17.69s 8810134
 –5 24.12s 8366616
 –6 38.67s 8238771 default
 –7 46.46s 8200544
 –8 117.09s 8171834
 –9 153.93s 8165282
dekomprese 3.33  –

rzip

Tabulka č. 565
přepínač paměť čas velikost
 –1 39540K 75.19s 6290904
 –2 43384K 72.59s 5992169
 –3 49272K 71.67s 5948152
 –4 59244K 71.48s 5929648
 –5 77152K 71.94s 5903737
 –6 77432K 88.21s 5905714 default
 –7 101235K 133.52s 5926667
 –8 102354K 166.02s 5916665
 –9 101267K 271.77s 5914410
dekomprese 3268K 24.05s  –

rar 3.30

Dictionary 1024K

Tabulka č. 566
-m2 9036K 55.73s 6363615
-m3 9036K 90.58s 6162404
-m4 29568K 89.55s 5563316
-m5 34696K 101.89s 5483564
dekomprese 25508K 55.38s  –

Dictionary 4096K

Tabulka č. 567
-m2 31640K 55.63s 5962677
-m3 31640K 90.88s 5732056
-m4 42576K 90.17s 5374120
-m5 57268K 102.65s 5297411
dekomprese 25416K 53.47s  –

Test ukázal několik věcí:

  • překvapilo mne, že gzip –9 je pomalejší než bzip2
  • pokud máme dostatek paměti, nevyplatí se u bzip2 se používat přepínače pro nižší stupeň komprese
  • rar3 je výborný komprimační program. Jeho výsledek překvapil i autora rzipu. Jak se říká: Pokud chceš vědět, co je nejlepší komprimační program, podívej se, čím je komprimován warez.
  • u gzipu se vyplatí používat –4 místo –3 ve známém: cvs -z4 up -dP
  • u rzipu je lepší používat –5 místo defaultního –6 (v man stránce je chybně uvedeno –9)
  • rzip používá pro kompresi 10× více paměti než bzip2
  • rzip má rychlost komprese i dekomprese srovnatelnou s bzip2
  • rzip a bzip2 mají při dekompresi srovnatelné paměťové nároky

Test č. 2

Dump root FreeBSD 5.2.1 partition. Tato partition obsahuje kromě základních programů pro start systému také tři kernely včetně modulů po 17 MB. Kernely a moduly jsou téměř shodné, takže zde by se mohl rzip hezky uplatnit. Nekomprimovaná velikost dumpu je 123 852 800 B.

bitcoin školení listopad 24

Tabulka č. 568
program usertime paměť výsledná velikost
gzip -best 717.288 840k 47415096
bzip2 –9 312.495 9612k 41893262
rzip –1 201.779 4364k 28341759
rzip –2 153.614 9295k 21431814
rzip –3 151.739 16871k 20801606
rzip –4 150.512 29583k 20447342
rzip –5 144.712 53301k 20304598
rzip –6 166.387 51977k 20034607
rzip –7 203.156 92153k 19745495
rzip –8 218.228 92058k 19733289
rzip –9 278.718 58896k 19720461
rar -m5 -md4096 562.589 38208k 29331514
rar -m4 -md4096 442.136 35768k 29372091
rar -m3 -md4096 362.993 31540k 30008857

Podle očekávání se zde rzip opravdu hezky vytáhl. Dost mne překvapil i výborný výsledek raru oproti bzip2. Opět se ukázalo, že u rzipu je volba –5 optimální.

Závěr

Dva jednoduché testy ukázaly, že se použití programu rzip rozhodně vyplatí. Jeho paměťová náročnost při komprimaci je sice o řád vyšší než je tomu u bzipu, ale v praxi je mnohem důležitější dekomprese, a tam jsou nároky rzip i bzip2 srovnatelné. Navíc i doba komprese je u rzipu a bzip2 podobná. Doporučoval bych tedy přejít u tarballů z .bz2 na .rz. Podle mého názoru má rozhodně rzip na to, aby postupně nahradil bzip2.

Autor článku