JMÉNO
bzip2, bunzip2
− komprimuje a dekomprimuje soubory,
používá metodu blokového
třídění, v1.0.3
bzcat − dekomprimuje soubory do standardního
výstupu (stdout)
bzip2recover − získává data z
poškozených bzip2 souborů
POUŽITÍ
bzip2 [
−cdfkqstvzVL123456789 ] [ soubory ... ]
bunzip2 [ −fkvsVL ] [ soubory ... ]
bzcat [ −s ] [ soubory ... ]
bzip2recover soubor
POPIS
bzip2 komprimuje /zhustí či zmenší/ soubory užitím Burrow−Wheelerova blokového třídícího textového komprimačního algoritmu a Huffmanova kódování. Komprese je všeobecně mnohem lepší než dosahují obvyklé komprimační nástroje založené na LZ77/LZ78 algoritmech (např. gzip) a blíží se výkonu PPM rodiny statistických kompresorů.
Volby příkazového řádku jsou záměrně velmi podobné volbám nástroje GNU gzip, ale nejsou zcela totožné.
bzip2 očekává příkaz doprovázený seznamem jmen souborů na příkazovém řádku. Každý soubor je nahrazen komprimovanou verzí sebe sama se jménem "původní_jméno.bz2". Každý komprimovaný soubor má stejné datum změny, přístupová práva a je−li to možné, také stejné vlastníky odpovídající původnímu souboru, takže tyto vlastnosti mohou být správně obnoveny při dekomprimaci. Zacházení se jménem souboru je možno považovat za hloupé na souborových systémech, kterým chybí mechanismus zabezpečení původního jména souboru, přístupových práv, vlastnictví nebo datumů či mají závažné omezení délky souborového jména (např. MS−DOS).
bzip2 a bunzip2 standardně nepřepisují již existující soubory. Jestliže toto žádáte, užijte volbu −f.
Pokud není určeno žádné jméno, bzip2 komprimuje standardní vstup do standardního výstupu. V tom případě bzip2 odmítne zapsat komprimovaný výstup na terminál, protože by to bylo zcela nesrozumitelné a tudíž zbytečné. (pozn. překl: bzip2 | cat již ano, ale psssst)
bunzip2 (nebo bzip2 −d) dekomprimuje všechny označené soubory. Soubory, které nebyly vytvořeny bzip2 budou rozeznány, vyřazeny a jejich jména obsažena ve varovném hlášení. bzip2 se pokouší vyvodit jméno dekomprimovaného souboru z komprimovaného, jak je uvedeno v následujících příkladech.
soubor.bz2
přejde na soubor
soubor.bz soubor
soubor.tbz2 soubor.tar
soubor.tbz soubor.tar
libéVámjméno přejde na
libéVámjméno.out
Jestliže souborové jméno nekončí jednou z následujících možností .bz2, .bz, .tbz2 nebo .tbz, bzip2 si postěžuje, že nemůže vyluštit jméno původního souboru a použije původní jméno se zakončením .out .
Stejně jako při kompresi, chybějící jméno způsobí dekompresi ze standardního vstupu do standardního výstupu. S tím rozdílem, že nyní není důvod odmítnout výstup na terminál.
bunzip2 správně dekomprimuje soubor který je zřetězením dvou či více komprimovaných souborů. Výsledkem je zřetězení odpovídajících nekomprimovaných souborů. Testovaní celistvosti (−t) zřetězených komprimovaných souborů je také podporováno.
Můžete také komprimovat a dekomprimovat soubory do standardního výstupu volbou −c. Hromadné soubory mohou být komprimovány a dekomprimovány také tak. Výsledné výstupy jsou postupně naskládány do standardního výstupu (stdout). Komprese hromadných souborů tímto způsobem vytváří proud obsahující hromadné komprimované soubory. Takový proud může být správně dekomprimován pouze bzip2 version 0.9.0 nebo vyšší. Nižší verze bzip2 se zastaví po dekomprimování prvního souboru v proudu.
bzcat (or bzip2 −dc) dekomprimuje všechny uvedené soubory do standardního výstupu.
bzip2 přečte argumenty z proměnných prostředí BZIP2 a BZIP, v tomto pořadí, a zpracuje je ještě před načtením argumentů z příkazové řádky. Tímto způsobem mohou být nastaveny obecné(defaultní) argumenty.
Komprese je vždy provedena, dokonce i tehdy, je−li získaný komprimovaný soubor nepatrně větší než původní. U souborů menších než zhruba sto bajtů je sklon ke zvětšení, neboť komprimační mechanismus má stálou režii kolem 50 bajtů. Náhodná data (uvažován výstup většiny souborových kompresorů) jsou kódována v 8.05 bitech na bajt při rozpětí kolem 0.5%.
Jako sebekontrolní mechanismus bzip2 užívá 32−bit CRC k ověření identity dekomprimované verze s originálem. To chrání proti deformaci komprimovaných dat a proti nerozeznaných chybám v bzip2 (doufejme, že velmi nepravděpodobných). Možnost nerozpoznaného poškození dat je nepatrná, v poměru 1 ku čtyřem biliónům na každý zpracovaný soubor. Uvědomme si však, že kontrola při dekompresi může pouze oznámit, že je něco špatně. Nemůže pomoci získat původní nekomprimovaná data. Pokud se chcete pokusit získat z poškozených souborů data, použijte program bzip2recover .
Návratové hodnoty: 0 správný konec, 1 problémy prostředí (soubor nebyl nalezen, špatné volby, I/O (vstupně/výstupní) chyby), 2 označuje porušení komprimovaného souboru, 3 vnitřní logickou chybu (tj. bug), jenž způsobila pád bzip2 .
VOLBY
−c −−stdout
Komprimuje nebo dekomprimuje do standardního výstupu
−d −−decompress
Vyvolá dekompresi. bzip2, bunzip2 and bzcat jsou ve skutečnosti stejné programy a rozhodnutí jaké činnosti budou provedeny závisí na užitém jménu. Avšak volba parametrem převyšuje nad tímto mechanismem a vyvolá bzip2 pro dekompresi.
−z −−compress
Protiklad k −d. Způsobí kompresi bez ohledu na volané jméno.
−t −−test
Kontroluje celistvost uvedeného souboru, ale nedekomprimuje jej. Ve skutečnosti provádí zkušební dekompresi a zahodí výsledek.
−f −−force
Přepíše výstupní soubory. Normálně bzip2 nepřepisuje existující výstupní soubory. Také bzip2 přeruší pevné odkazy k souborům, což by jinak neprovedl.
bzip2 normálně odmítne dekomprimovat soubory, jimž nesedí "magická hlavička". Při volbě −f (−−force) bzip2 dekomprimuje i tyto soubory, čímž napodobuje chování GNU gzip.
−k −−keep
Zachová (nemaže) vstupní soubory během komprese nebo dekomprese.
−s −−small
Omezí velikost použité paměti pro kompresi, dekompresi i testování. Při dekompresi a testování je užíván upravený algoritmus, jenž vyžaduje pouze 2.5 bajtů pro blok. To znamená, že jakýkoliv soubor může být dekomprimován pouze s 2300kB dostupné paměti, avšak poloviční rychlostí.
Během komprese, znak −s vybere velikost bloku 200kB, čímž příslušně omezí velikost užité paměti za cenu nižšího kompresního poměru. Tedy, má−li váš počítač 8MB či méně operační paměti užijte volbu −s. Čtete ŘÍZENÍ PAMĚTI dále.
−q −−quiet
Potlačí nepodstatná varování. Zprávy týkající se I/O chyb a jiných kritických událostí nebudou potlačeny.
−v −−verbose
Upovídaná volba −− ukazuje pro každý zpracovaný soubor kompresní poměr. Dále volba −v zvyšuje výmluvnost, chrlí množství informací, které jsou zajímavé zejména pro diagnostické účely.
−L −−license −V −−version
Zobrazí verzi, licenční podmínky.
−1 (či −−fast) až −9 (či −−best)
Nastaví velikost bloku na 100kB, 200kB .. 900kB pro komprimaci. Nemá žádný vliv na dekomprimaci. Čti ŘÍZENÍ PAMĚTI dále. Volby −−fast a −−best jsou podporovány z důvodu kompatability s GNU gzip. Popravdě, −−fast toho moc neurychlí. A −−best pouze zvolí defaultní chování.
−− |
Považuje všechny následující argumenty za souborová jména, i pokud začínají pomlčkou. Takže můžete zacházet také se soubory s pomlčkou například bzip2 −− −méskvělévyspekulovanéjménosouboru. |
−−repetitive−fast −−repetitive−best
Tato volba je zbytečná ve verzi 0.9.5 a vyšších. Poskytovala určité surové ovládání chování třídícího algoritmu v předchozích verzích a byla v lecčem užitečná. Verze 0.9.5 a vyšší mají zdokonalený algoritmus, který činí tuto volbu bezvýznamnou.
ŘÍZENÍ PAMĚTI
bzip2 komprimuje velké soubory v blocích. Velikost bloku má vliv jednak na dosažený kompresní poměr a také na množství potřebné paměti pro kompresi a dekompresi. Volby −1 až −9 určují velikost bloku od 100kB do 900KB (standard). Při dekompresi je velikost bloku, užitá pro kompresi, načtena z hlavičky zkomprimovaného souboru a bunzip2 již sám vyhradí dostatek paměti pro dekompresi. Protože velikost bloku je uložena ve zkomprimovaném souboru, volby −1 až −9 jsou zbytečné a proto při dekompresi zůstanou nepovšimnuty.
Kompresní a dekompresní paměťové požadavky v bajtech mohou být odhadnuty takto:
Komprese: 400k + (8 x velikost bloku)
Dekomprese: 100k + (4 x velikost bloku) nebo 100k + (2.5 x velikost bloku)
Větší bloky nepřinášejí přiměřený nárůst komprese, neboť většina komprese je vytvořena v prvních dvou či třech stech tisících bajtů bloku (což těší mysl uživatele malých strojů). Je také důležité si uvědomit, že dekompresní paměťové požadavky jsou nastaveny v době komprese výběrem velikosti bloku.
Pro soubor komprimovaný s přednastavenou velikostí bloku 900kB bunzip2 vyžaduje při dekompresi 3700kB paměti. Pro umožnění dekomprimování libovolného souboru na počítači s pouze 4MB operační paměti má bunzip2 volbu pro dekompresi užívající přibližně poloviční množství paměti, kolem 2300kB. Rychlost je také snížena na polovinu, proto byste tuto možnost měli užít pouze, je−li to opravdu nutné. Odpovídající volba je −s.
Obecně řečeno, zkuste a užijte největší možnou velikost bloku v zájmu dosažení maximální komprese. Rychlost komprese a dekomprese prakticky není velikostí bloku ovlivněna.
Dále se podíváme na uplatnění bzip2 na soubory, které se vejdou do jednoho bloku. To je většina souborů, se kterými se setkáte, pokud použijete velkou blokovou velikost. Množství skutečně užité paměti je přiměřená velikosti takového souboru, protože soubor je menší než blok. Například příkaz komprimace souboru velkého 20kB s volbou −9 způsobí, že kompresor přidělí asi 7600kB paměti, ale použije pouze 400k + (20000 * 8) = 560kB. Podobně dekompresor přidělí 3700kB ale použije pouze 100kB + (2000 * 4) = 180KB.
Následuje tabulka sestávající z hodnot maximálního užití paměti pro různé velikosti bloku. Obsahuje také výslednou komprimovanou velikost balíku 14 souborů Calgary Text Compression Corpus mající původní celkovou velikost 3,141,622 bajtů. Tento údaj dovolí nahlédnout vlivu velikosti bloku na kompresi. Tabulka směřuje k výkladu výhod užití větších bloků pro větší soubory.
Komprese
Dekomprese Dekomprese Velikost
volba paměť paměť −s
paměť korpusu
−1 1200k
500k 350k 914704
−2 2000k 900k 600k 877703
−3 2800k 1300k 850k 860338
−4 3600k 1700k 1100k 846899
−5 4400k 2100k 1350k 845160
−6 5200k 2500k 1600k 838626
−7 6100k 2900k 1850k 834096
−8 6800k 3300k 2100k 828642
−9 7600k 3700k 2350k 828642
ZÍSKÁNÍ DAT Z POŠKOZENÝCH SOUBORŮ
bzip2 komprimuje soubory v blocích, obyčejně 900kB velkých. S každých blokem je nakládáno nezávisle. Jestliže chyba záznamu či přenosu se projeví v některém z bloků, .bz2 soubor je poškozen, ale přesto je možné získat data z nepoškozených bloků data.
Komprimované prohlášení každého bloku je vymezeno 48−bit předlohou, která umožňuje nalezení hranic bloku s přijatelnou přesností. Každý blok také uchovává vlastní 32−bit CRC a tak poškozené bloky mohou být rozlišeny od nepoškozených.
bzip2recover je jednoduchý program, jehož úlohou je hledat bloky v .bz2 souborech a zapisovat každý blok do vlastního souboru .bz2 Můžete užít bzip2 −t , jenž ověřuje spojitost výsledných souborů a dekomprimuje nepoškozené bez zápisu výstupu.
bzip2recover vyžaduje jednoduše jméno poškozeného souboru a vytváří číslované soubory "rec0001soubor.bz2", "rec002soubor.bz2" atd., obsahující rozbalené bloky. Pojmenování výstupních souborů je navrženo tak, aby použití žolíkových znaků způsobilo správnou sestavu souborů. Např. "bzip2 −dc rec*file.bz2 > získaná_data".
Použití bzip2recover je spojeno s velkými .bz2 soubory, právě takové obsahují mnoho bloků. Je zřejmě marné pokoušet se zachránit jednoblokový poškozený soubor, neboť samotný poškozený blok nemůže být obnoven. Jestliže usilujete o zmenšení rizika ztráty dat zapříčiněnou chybou média či přenosu, uvažujte o kompresi s malou velikostí bloku.
POZNÁMKA K VÝKONU
Třídící část komprese shromažďuje podobné řetězce v souboru. Z toho důvodu může být mnohem pomalejší komprimace souboru, obsahujícího velmi dlouhé nudle opakujících se znaků, např. "aabaabaabaab ... ", než je obvyklé. Verze 0.9.5 a vyšší toto mnohem lépe tráví nežli předchozí verze. Poměr mezi nejhorším a průměrných časem komprese je kolem 10:1. Předchozí verze statečně dosahovaly poměru 100:1. Pokud zadáte volbu −vvvv, můžete sledovat průběh v detailu.
Dekompresní rychlost tím není ovlivněna.
bzip2 obvykle obsadí několik megabajtů paměti a pak je vyplňuje doslova náhodně rozmařilým způsobem. To znamená, že výkon komprese i dekomprese je silně ovlivněn rychlostí obsluhy cache. Proto malé změny v kódu přístupu cache by měly způsobit nepoměrně velké zlepšení výkonu. Výkon bzip2 bude pravděpodobně nejlepší na strojích s velmi velkými cache.
NÁSTRAHY
I/O chybové zprávy nejsou tak užitečné, jak by mohly být. bzip2 se pilně pokouší rozeznat I/O chyby a slušně ukončit činnost, ale detailní zprávy o problému jsou občas poněkud matoucí.
Tato příručka náleží k verzi 1.0.3 bzip2. Komprimovaná data vytvořená touto verzí jsou zcela oboustranně slučitelná s předcházejícími veřejnými vydáními, verzemi 0.1pl2, 0.9.0 a 0.9.5. Ovšem s následující výjimkou: 0.9.0 a vyšší umí správně dekomprimovat zřetězené komprimované soubory. 0.1pl2 to neumí, a zastaví se po dokončení dekomprese prvního souboru v proudu.
bzip2recover verze starší než 1.0.2 používaly 32−bitovou reprezentaci pozice v komprimovaném souboru, a proto se nevypořádaly se soubory většími než 512 MB. Verze 1.0.2 a novější používají 64−bitovou reprezentaci pozice na systémech, kde je to podporováno (GNU systémy a Windows). Pro zjitění, zda byl bzip2recover skompilován s tímto omezením, spusťte ho bez parametrů. Kdekoliv si můžete skompilovat verzi bez tohoto omezení, pokud nastavíte MaybeUInt64 na nějaký typ odpovídající unsigned 64−bit integer.
AUTOR
Julian Seward, jseward [AT] acm.org.
Myšlenky vložené do bzip2 pocházejí od následujících lidí: Michael Burrows a David Wheeler (bloky řadící přeměna), David Wheeler (opět, Huffmanovo kodóvání), Peter Fenwick (strukturovaný model kódování v původním bzip, a řada zdokonalení), Alistair Moffat, Radford Neal a Ian Witten (aritmetické kódovaní v původním bzip). Mnoho jim vděčím za jejich pomoc, podporu a rady. Pro odkazy na zdrojovou dokumentaci se podívejte do příručky v balíčku zdrojového kódu. Christian von Roques mě přivedl k hledání rychlejšího třídícího algoritmu, to pro zvýšení rychlosti komprese. Bela Lubkin mě podpořil při zdokonalení toho nejhoršího případu kompresního výkonu. Skripty bz* jsou odvozeny od GNU gzip. Mnoho lidí poslalo záplaty, pomohlo s problémy v přenositelnosti, půjčilo stroje, dalo rady a byli obecně nápomocni.