Linuxové noviny | Leden 1998 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Možná jste si už všimli, že na serverech zrcadlících zdrojové texty jádra z ftp.kernel.org se objevily nové soubory. Mají záhadnou příponu .bz2 a jsou podstatně kratší než soubory s klasickou příponou .gz. Jsou komprimovány programem bzip2, jehož autorem je Julian Seward (jseward@acm.org). Program bzip2 používá při komprimaci Burrows-Wheelerův blokově-řadící komprimační algoritmus a Huffmanovo kódování. Komprimace je obvykle kvalitnější než při použití klasických algoritmů Lempel-Ziv (LZ77/LZ78), které používá např. program gzip. Parametry programu bzip2 jsou velice podobné parametrům programu gzip. Bzip2 očekává na příkazové řádce seznam jmen souborů doprovázený seznamem parametrů. Každý soubor je stejně jako u programu gzip nahrazen komprimovanou verzí, jejíž jméno obsahuje navíc příponu .bz2. Každý komprimovaný soubor má stejná přístupová práva a čas modifikace jako původní soubor a proto mohou být tyto atributy souboru při dekomprimaci korektně nastaveny. Pokud nejsou specifikovány žádné vstupní soubory, bude komprimován standardní vstup. Bunzip2 (případně bzip2 -d) dekomprimuje všechny specifikované soubory s příponou .bz2. Soubory bez této přípony jsou ignorovány. Komprimace je prováděna i tehdy, bude-li komprimovaný soubor větší než originál. Proto soubory, jejichž délka je menší než přibližně 100 bytů, nemá smysl komprimovat (jen tak pro zajímavost: výsledný soubor po komprimaci souboru nulové délky má velikost 14 bytů). Bzip2 používá 32-bitový CRC pro kontrolu integrity dat. Pokud kontrolní suma není správná, musíte použít místo programu bunzip2 program bzip2recover, který umožňuje obnovu dat z poškozených komprimovaných souborů. Bzip2 komprimuje velké soubory v blocích. Velikost bloku ovlivňuje jak komprimační faktor, tak i množství potřebné paměti jak pro komprimaci tak pro zpětnou dekomprimaci. Parametry příkazové řádky -1 až -9 specifikují velikost bloku (od 100000 do implicitních 900000 bajtů). Při dekomprimaci je velikost bloku čtena z hlavičky komprimovaného souboru (nižší čtyři bity čtvrtého bytu souboru). Paměťová náročnost může být přibližně stanovena takto:
Pro soubory komprimované se standardní velikostí bloku (900000 bytů) bude bzip2 potřebovat přibližně 4600 kilobytů paměti pro dekomprimaci. Aby bylo možné dekomprimovat soubory i na počítačích se 4MB paměti, byla přidána volba -s, která snižuje na polovinu paměťovou náročnost a zvyšuje čas dekomprimace. Tato volba existuje z důvodů neexistence virtuální paměti na podporovaných operačních systémech (unixové operační systémy, Microsoft Windows 95 a Windows NT, DOS). Asi nejčastější otázka pokládaná na různých konferencích byla: "Jak je na tom bzip2 v porovnání s gzip?". Tuto otázku si pravděpodobně položíte také a proto jsem pro čtenáře Linuxových novin připravil takový malý test, porovnání obou zmiňovaných programů. Zaměřil jsem se hlavně na dva aspekty - na kvalitu komprimace a na dobu komprimace a zpětné dekomprimace. Testy probíhaly pouze na jediném souboru - na zdrojových textech jádra 2.1.76 ve formátu tar. Původní velikost tohoto souboru byla 40867840 bytů. V tabulce Porovnání programů bzip2 a gzip jsou znázorněny hodnoty komprimačního poměru v procentech (poměr délka komprimovaného souboru ku délce původního souboru) a čas potřebný k provedení komprimace. Testovacím počítačem mi byla pracovní stanice s procesorem Intel Pentium 133MHz, SCSI, 64MB RAM, Linux 2.0.33 a bzip2-0.1pl2.
Tabulka 1: Porovnání programů bzip2 a gzip Bližší informace o programu bzip2 naleznete na jeho domovské stránce http://www.muraroa.demon.co.uk/. |