NÉV¶
bzip2, bunzip2 - 'block-sorting' eljárással dolgozó
tömörítőprogram, v0.9.0
bzcat - stdout-ra csomagolja ki az állományt
bzip2recover - sérült bzip2 adatait próbálja megmenteni
ÁTTEKINTÉS¶
bzip2 [
-cdfkstvzVL123456789 ] [
fájlnevek ... ]
bunzip2 [
-fkvsVL ] [
fájlnevek ... ]
bzcat [
-s ] [
fájlnevek ... ]
bzip2recover fájlnév
LEÍRÁS¶
A
bzip2 Burrows-Wheeler-féle blokkrendező algoritmussal és
Huffman-kódolással tömörít szöveges
állományokat. A tömörítés mértéke
általában lényegesen jobb, mint ami a legtöbb
hagyományos LZ77/LZ78 alapú tömörítővel
elérhető, és megközelíti a statisztikus
módszerrel dolgozó PPM család teljesítményét.
A parancssori opciók szándékosan igen hasonlóak a
GNU
Gzip opcióihoz, de nem azonosak azokkal.
A
bzip2 állománynevek listáját várja a
hozzájuk tartozó parancssori kapcsolókkal. Minden fájlt
azok "eredeti_név.bz2" nevű tömörített
változatára cserél ki. A tömörített
fájlokhoz tartozó dátumok és jogok az eredetivel
megegyeznek, így ezek a tulajdonságok kicsomagoláskor helyesen
állíthatók vissza. A fájlnevek kezelése egyszerű
abban az értelemben, hogy nincs lehetőség az eredeti
fájlnevek, jogok és dátumok megőrzésére az
ezeket nem támogató, vagy a MS-DOS-hoz hasonlóan szigorúan
kötött hosszúságú neveket kezelő
fájlrendszerekben.
A
bzip2 és a
bunzip2 alapértelmezés szerint nem
írnak felül már létező fájlokat; erre a -f
kapcsoló használatával lehet rávenni őket.
Fájlnevek hiányában a
bzip2 a szabványos
bemenetről a szabványos kimenetre dolgozik. Ebben az esetben azonban
a
bzip2 nem fogja a tömörített adatokat a
terminálra írni, mert az feldolgozhatatlan, így
értelmetlen volna.
A
bunzip2 (vagy a
bzip2 -d ) kicsomagolja és
visszaállítja a felsorolt fájlok közül a
".bz2"-re végződő nevűket. A nem erre
végződő nevű fájlokat nem veszi figyelembe.
Ismételten: ha nem adunk meg fájlnevet, a
tömörítés standard inputról szabványos kimenetre
történik.
A
bunzip2 helyesen fogja kicsomagolni azokat a fájlokat, melyek
két vagy több tömörített fájl
összevonásával (összemásolásával)
keletkeznek. Az eredmény a kicsomagolt fájlok egybemásolt
láncolata lesz. A fájlok sértetlenségének
ellenőrzése (-t) az összeláncolt archívumokon is
működik.
A szabványos kimenetre is lehet be- illetve kicsomagolni fájlokat a -c
kapcsoló megadásával. Egyszerre több fájllal is lehet
így dolgozni. A keletkező kimenetek sorban a szabványos
kimenetre kerülnek. Több fájl ily módon
történő tömörítése egy olyan adatfolyamot
eredményez, melyben az egyes fájlok tömörítve
szerepelnek. Egy ilyen állomány helyesen csak a
bzip2 0.9.0-s
vagy újabb verziójával csomagolható ki. A
bzip2
régebbi verziói az első fájl kibontása után
megállnak.
A
bzcat (vagy a
bzip2 -dc ) a megadott fájlokat a
szabványos kimenetre csomagolja ki.
A tömörítés mindig megtörténik, még akkor is,
ha a tömörített fájl esetleg valamivel nagyobb, mint az
eredeti. A kb. 100 bájtnál kisebb fájlok hajlamosak erre, mivel
a tömörítő mechanizmus maga is hozzáad úgy 50
bájtot az archívumhoz.
Az olyan adathalmazra, melyben az egyes elemek előfordulása
véletlenszerű (ilyen a legtöbb
tömörítőprogram kimenete), a kódolás kb. 8.05
bit/bájt aránnyal történik, ami
megközelítőleg 0.5%-os méretnövekedést
eredményez.
Önellenőrzésként az adatok védelmére a
bzip2 32 bites CRC-ket (ellenőrző összegeket)
használ, így biztosítva, hogy a kitömörített
állomány az eredetivel megegyezzen. Ez egyrészt a
tömörített adatok sérülése ellen,
másrészt pedig a
bzip2 eddig fel nem derített (és
remélhetőleg igen valószínűtlen) hibái ellen
véd. Annak az esélye, hogy a tömörített adatban
előforduló hiba észrevétlen marad, igen kicsi,
megközelítőleg egy a négybillióhoz minden egyes
tömörített fájl esetében. Lényeges azonban, hogy
az ellenőrzés kicsomagoláskor történik, és csak
arra hívja fel a figyelmet, hogy valami nincs rendben, az eredeti adatot
visszaállítani nem tudja. A
bzip2recover -rel lehet
megpróbálni az adatok visszaállítását a
sérült fájlból.
Visszatérési értékek: 0 ha a program futása rendesen
befejeződött 1 ha környezeti problémába futott (nem
találja a fájlt, rossz kapcsolót kapott, I/O hiba esetén,
stb.) 2 ha a tömörített fájl hibás 3 ha belső
hiba (pl. bug) miatt a
bzip2 azonnal felfüggesztette
futását.
MEMÓRIAKEZELÉS¶
A
Bzip2 a nagy fájlokat blokkokban kezeli. A blokkméret
meghatározza mind az elérhető tömörítési
arányt, mind pedig a be- és kicsomagoláshoz szükséges
memória mennyiségét. A -1 ... -9 kapcsolók az egyes
blokkméreteket 100,000 ... 900,000 bájt értékekre
állítják. Kibontáskor a program az arhívum
fejlécéből olvassa ki a tömörítéskor
használt blokkméretet, és a
bunzip2 ennek
megfelelően éppen annyi memóriát foglal le magának,
amennyi a kibontáshoz szükséges. Mivel a blokkméret a
tömörített fájlban van, a -1 ... -9 kapcsolóknak
nincs jelentőségük és azokat a program kibontáskor
figyelmen kívül hagyja.
A be- és kicsomagolás memóriaigénye bájtban
megközelítőleg a
Tömörítés: 400k + ( 7 x blokkméret)
Kibontás: 100k + ( 4 x blokkméret), vagy
100k + ( 2.5 x blokkméret) képletekkel becsülhető meg,
Nagyobb blokkméret gyorsan csökkenő mellékes nyereséget
ad; a tömörítés jelentős részét a
blokkméret első 2-300k-ja adja. Ezt érdemes fejben tartani a
bzip2 kis gépeken történő használatakor.
Arról sem szabad megfeledkezni, hogy a kibontás
memóriaigényét a tömörítéskor
választott blokkméret határozza meg.
Az alapértelmezett 900k méretű blokkokkal
tömörített fájlok esetében a
bunzip2 a
kibontáshoz kb. 3700k memóriát fog használni. Hogy minden
fájl kibontható legyen még egy 4 megabájtos gépen is,
a
bunzip2 lehetővé teszi a kibontást kb. feleennyi,
megközelítőleg 2300k memória
felhasználásával is. Ezzel a kibontás sebessége is
feleződik, így csak akkor érdemes használni ezt a
lehetőséget, amikor valóban szükséges. Az
idevonatkozó kapcsoló a -s.
Általában, ha a rendelkezésre álló memória
mennyisége engedi, érdemes megpróbálkozni a legnagyobb
blokkméret használatával, mivel így érhető el a
legjobb tömörítési arány. A
tömörítés és kibontás sebességét a
blokkméret gyakorlatilag nem befolyásolja.
Másik lényeges pont azoknak a fájloknak az esete, melyek egyetlen
blokkba beleférnek - nagy blokkméret használatakor ez a
legtöbb fájlra fennáll. A ténylegesen felhasznált
memória mennyisége a fájl méretével arányos,
mivel a fájl kisebb, mint egy blokk. Egy 20,000 bájt hosszú
fájl -9 kapcsolóval történő
tömörítésekor például kb. 6700k
memóriát foglal le a tömörítőprogram, de csak
400k + 20000 * 7 = 540k-t használ belőle. Kibontáskor ehhez
hasonlóan 3700k-t foglal le, de csak 100k + 20000 * 4 = 180k-t
használ.
A következő táblázat a különböző
blokkméretekhez tartozó maximális
memóriafelhasználást, valamint a Calgary
Szövegtömörítés Dokumentáció összesen
3,141,622 bájtos 14 fájljának tömörített
méretét tartalmazza. Ez az oszlop némi áttekintést ad
arról, hogyan változik a tömörítés
mértéke a blokkméret függvényében. Ezek a
számok nem igazán mutatják a nagy blokkméret előnyeit
nagyobb fájlokra, mivel a Dokumentációban a kisméretű
fájlok túlsúlyban vannak.
Tömörítés Kibontás Kibontás
Dokumentáció
Kapcsoló mem.haszn. mem.haszn. -s -sel mérete
-1 1100k 500k 350k 914704
-2 1800k 900k 600k 877703
-3 2500k 1300k 850k 860338
-4 3200k 1700k 1100k 846899
-5 3900k 2100k 1350k 845160
-6 4600k 2500k 1600k 838626
-7 5400k 2900k 1850k 834096
-8 6000k 3300k 2100k 828642
-9 6700k 3700k 2350k 828642
OPCIÓK¶
- -c --stdout
- Tömörítés vagy kibontás a
szabványos kimenetre. A -c -vel több fájl bontható ki
egyszerre, de csak egyetlen fájl tömöríthető a
stdout-ra.
- -d --decompress
- Kibontás. A bzip2, bunzip2 és a
bzcat tulajdonképpen ugyanaz a program, ami annak alapján
dönti el, hogy mit kell tennie, hogy melyik nevét
használjuk. Ez a kapcsoló felülbírálja ezt a
döntést, és a bzip2 kibontóként fog
működni.
- -z --compress
- A -d ellentéte: a tömörítést
erőlteti, függetlenül attól, hogy a programot melyik
nevével indítottuk.
- -t --test
- A megadott fájlok sértetlenségét
ellenőrzi, de nem bontja ki őket. Valójában egy
"próbakibontást" végez, és az eredményt
eldobja.
- -f --force
- Felülírja a kimeneti állományokat.
Rendes esetben a bzip2 nem ír felül már
létező kimeneti fájlokat.
- -k --keep
- Megtartja (nem törli le) a bemenő
állományokat be- és kitömörítéskor.
- -s --small
- Csökkenti a memóriahasználatot,
tömörítéskor, kibontáskor, és
teszteléskor. A fájlok kibontása és tesztelése
egy módosított algoritmussal történik, amelynek
csupán 2.5 bájtra van szüksége bájtonként a
blokkban. Ez azt jelenti, hogy bármelyik fájl kibontható
2300k memóriában, igaz, a normál sebességnek csaknem
felével.
Tömörítéskor a -s 200k blokkméretet állít
be, ami a memóriahasználatot megközelítőleg
ugyanezekre az értékekre korlátozza, a
tömörítés mértékének
rovására. Röviden: kevés memóriával (8
megabájt vagy kevesebb) rendelkező gép esetében mindig
használjuk a -s kapcsolót. (ld. még:
MEMÓRIAKEZELÉS)
- -v --verbose
- Bőbeszédű mód -- megmutatja a
tömörítés mértékét minden feldolgozott
fájl esetében. További -v-k a
"bőbeszédűség" mértékét
növelik, rengeteg olyan információt adva, melyek
főként diagnosztikai célból lehetnek érdekesek.
- -L --license -V --version
- A program verziószámát,
felhasználói engedélyeket és feltételeket
jeleníti meg.
- -1 to -9
- Tömörítéskor a blokkméretet
állítja 100k, 200k ... 900k-ra. Kibontáskor semmilyen
hatása nincs. Lásd még: MEMÓRIAKEZELÉS
- --repetitive-fast
- bzip2 Némi ál-véletlenszerű
variációt visz az erősen ismétlődő
jellegű blokkokba, hogy tömörítéskor
csökkentse a "legrosszabb eset" esetén
előálló teljesítményromlás
valószínűségét. Ha a rendezés
nehézségekbe ütközik, a program a blokkot
összekeveri, és a rendezést újraindítja.
Durván, a bzip2 háromszor annyi ideig tart ki az
újrarendezés előtt az összekeverésig, mint
ameddig egy "jó" bemenet feldolgozása tartana. Ezzel a
kapcsolóval sokkal hamarabb feladja.
- --repetitive-best
- A --repetitive-fast ellentéte; sokkal keményebben
próbálkozik az összekeverésig a rendezés
előtt.
ADATMENTÉS SÉRÜLT FÁJLOKBÓL¶
A
bzip2 a fájlokat rendszerint 900 kilobájtos blokkokban
tömöríti. Minden blokkot külön kezel. Ha az
adathordozó vagy az átvitel hibája miatt egy több
blokkból álló .bz2 fájl megsérül,
elképzelhető az adatok megmentése az állomány
sértetlen blokkjaiból.
Minden blokk tömörített megfelelőjét egy-egy 48 bites
minta határolja, ami elég jó biztonsággal teszi
lehetővé a blokkhatárok megállapítását.
Minden blokk tartalmazza a saját 32 bites CRC-jét, így a
sérült és a sértetlen blokkok egymástól
megkülönböztethetők.
A
bzip2recover egy egyszerű program, aminek célja az egyes
blokkok megtalálása a .bz2 archívumban, és
különálló .bz2 fájlokként való
kiírása. Ezek között a
bzip2 -t
segítségével megkereshetők és kibonthatók a
sértetlen blokkok.
A
bzip2recover egyetlen, egyszerű argumentumot fogad el, ez pedig a
sérült állomány neve, és a
különálló blokkokat tartalmazó fájlokat hoz
létre "rec0001file.bz2", "rec0002file.bz2", stb.
néven. A keletkező fájlok nevei olyanok, hogy az egymást
követő feldolgozásoknál a joker karakterek
használatakor, például a "bzip2 -dc rec*file.bz2 >
javított_adat" esetén a fájlok a helyes sorrendben
jelennek meg.
A
bzip2recover nagy .bz2 fájlok esetén lehet hasznos, mivel
ezek több blokkot tartalmaznak. Teljesen hiábavaló a
használata az egy blokkot tartalmazó sérült
fájloknál, mivel sérült blokk nem állítható
helyre. Az adathordozó vagy az átvitel hibáiból
adódó adatvesztés lehetőségének a lehető
legkisebbre csökkentéséhez megfontolandó esetleg a kisebb
blokkméret használata.
A TELJESÍTMÉNYRŐL¶
A tömörítés rendezés fázisában a fájl
hasonló részeinek összegyűjtése történik.
Emiatt az ismétlődő szimbólumok igen hosszú
láncolatát (mint pl. a több százszor
ismétlődő "aabaabaabaab ...") tartalmazó
fájl tömörítése szélsőségesen
lassú lehet. Ilyenkor a -vvvvv opcióval esetleg részletesen
nyomon követhető a folyamat. A kibontás sebességét ez
nem befolyásolja.
Az ilyen beteges esetek a gyakorlatban ritkának tűnnek, főleg
tesztcélokra mesterségesen összeállított
fájlokban, és alacsony szintű disk image-ekben (egy
hajlékony- vagy merevlemez tartalma fájlba írva) fordulnak
elő. Ez utóbbiak
bzip2 -vel történő
tömörítése nem javasolt.
Ha egy fájl tömörítésekor jelentős lassulás
tapasztalható, érdemes megpróbálni a legkisebb
blokkméret beállítását a -1 kapcsolóval.
A
bzip2 rendszerint pár megabájt memóriát foglal le
magának, amiben dolgozhat, aztán az egészet eléggé
össze-vissza módon töltögeti fel. Ez azt jelenti, hogy
mind a tömörítés, mind pedig a kibontás esetén a
teljesítményt nagyban az határozza meg, hogy a rendszer milyen
gyorsan tudja kiszolgálni a cache-ben nem található adatokra
irányuló kéréseket. Emiatt a programkód ilyen esetek
arányának csökkentését célzó kis
változtatására aránytalanul nagy
teljesítménynövekedés figyelhető meg. A
bzip2
így valószínűleg a nagyon nagy cache-sel rendelkező
gépeken teljesít a legjobban.
FIGYELMEZTETÉS¶
Az I/O hibajelzések nem olyan hasznosak, amilyenek lehetnének. A
bzip2 keményen próbálkozik, hogy az I/O hibákat
észrevegye, és tisztán lépjen ki, de annak a
részletei, hogy tulajdonképpen mi is volt a probléma, gyakran
félrevezetőnek tűnnek.
Ez a kézikönyvoldal a
bzip2 0.9.0-ás verzióra
vonatkozik. Az ezen verzióval készített
tömörített adat teljes mértékben kompatíbilis az
ezt megelőző, szabadon terjeszthető 0.1pl2 verzióval
készítettel, egyetlen kivétellel: 0.9.0 helyesen bontja ki a
több archívumot tartalmazó összevont fájlokat. A
0.1pl2 ezt nem tudja megtenni: az első fájl kibontása után
megáll.
Windows 95 és NT alatt a joker karakterek használata nem
tökéletes.
A
bzip2recover 32 bites egészeket használ a
tömörített fájlokban a bitpozíciók
ábrázolására, így nem képes kezelni az 512
megabájtnál nagyobb archívumokat. Ez a probléma
egyszerűen javítható.
SZERZŐ¶
Julian Seward, jseward@acm.org.
http://www.muraroa.demon.co.uk
A
bzip2 -ben megtestesült ötletek a következőknek
tulajdoníthatók: Michael Burrows és David Wheeler
(blokkrendező transzformáció) David Wheeler (Huffman
kódoló) Peter Fenwick (strukturált programozási modell az
eredeti
bzip -ben és több finomítás) és
Alistair Moffat, Radford Neal valamint Ian Witten (az eredeti
bzip
aritmetikai kódolója). Köszönet illeti őket
segítségükért, támogatásukért és
tanácsaikért.
A program forráskódjához mellékelt dokumentációban
találhatók még hivatkozások további
dokumentációforrásokra. Christian von Roques
ösztökélt gyorsabb rendező algoritmus
keresésére, és a tömörítés
gyorsítására. Bela Lubkin biztatott a
tömörítő "legrosszabb eset"-i
teljesítményének növelésére. Több ember
küldött hibajavításokat, segített
hordozhatósági problémák megoldásában, adott
kölcsön gépeket, adott tanácsot és volt
általában segítségemre.