Deflate
Asi nejznámější kompresní metoda je Deflate, který využívá například nástroj gzip v souborech .gz
. Autorem metody Deflate byl geniální americký programátor Phil Katz, který ji uvedl v roce 1992 ve svém archivačním programu PKZIP. Interně se jedná o kombinaci slovníkové kompresní metody LZ77 a Huffmanova kódování.
Před kompresí jsou vstupní data rozdělena do bloků různé velikosti. Pro každý blok zvlášť jsou pak sestaveny Huffmanovy tabulky. Rozdělení do bloků při kompresi je složitá optimalizační úloha, kterou řeší nástroj Zopfli. Ten zvyšuje kompresní poměr za cenu extrémně pomalé rychlosti komprese.
bzip2 a bzip3
Nástroj bzip2 byl poprvé vydán v roce 1996 britským programátorem Julianem Sewardem. Je založen na Burrowsově–Wheelerově transformaci (BWT), move-to-front transformaci (MTF) a Huffmanově kódování. Bzip2 komprimuje většinu souborů efektivněji než Deflate ( .zip
, .gz
), ale je znatelně pomalejší.
Duchovním nástupcem bzip2 je bzip3, který poprvé vyšel v roce 2022. Dosahuje ještě vyšších kompresních poměrů než bzip2, ale cenou je další snížení rychlosti. Je založen na Burrowsově–Wheelerově transformaci, metodě LZ+P a aritmetickém kodéru.
LZMA (xz)
Dalšími široce používanými nástroji jsou xz
a lzma
z balíku XZ Utils. Nástroj xz komprimuje data metodou LZMA2. Naproti tomu nástroj lzma používá metodu LZMA. To je algoritmus vyvinutý programátorem Igorem Pavlovem pro jeho archivační program 7-Zip v roce 1999.
Skládá se z metody LZ77, Markovových řetězců a aritmetického kodéru (range coder). Co se týče kompresního poměru, rozdíl mezi metodami LZMA a LZMA2 je zanedbatelný.
LZ4, lzop
LZ4 se slovníková metoda z roku 2011 zaměřená na rychlost komprese a dekomprese. Implementuje LZ77 a na rozdíl od jiných algoritmů nepoužívá entropické kódování. Existuje odnož LZ4 HC, která dosahuje vyšších kompresních poměrů za cenu nižší rychlosti; bitstream je plně kompatibilní s LZ4.
LZ4 je srovnatelný s metodou LZO (Lempel–Ziv–Oberhumer), kterou implementuje nástroj lzop. Ta je zaměřena na rychlost dekomprese, ale nedosahuje takových rychlostí jako LZ4. lzop byl poprvé vydán v roce 1997 a nemá oficiální specifikaci.
Brotli, Zstandard
Nástroj Brotli byl vyvinut v roce 2013 společností Google. Používá kombinaci LZ77, Huffmanova kódování a kontextového modelování. Měl by poskytovat lepší kompresní poměr než Deflate. Nástroj je zaměřen na kompresi souborů HTML, CSS a JavaScript.
Podobně byl v roce 2015 společností Facebook uvolněn nástroj Zstandard (Zstd). Je to kombinace LZ77 a entropického kódování. Běžně dosahuje podobných kompresních poměrů jako Deflate, ale za to je rychlejší. Při maximální kompresi dosahuje Zstd kompresních poměru blízko LZMA. Oproti knihovnám implementující Deflate dosahuje vyšší kompresní i dekompresní rychlosti.
ZPAQ
Mezi méně známé nástroje pro kompresi dat patří zpaq, který je určen pro inkrementální zálohy. Jedná se o archivační program, který umí soubory do archivu pouze přidávat. Umí se ale vrátit to předchozího stavu a načíst starší verze souborů.
Jako předzpracování umožňuje zpaq použít metody LZ77, BWT a E8E9. Pro vlastní kompresi používá kontextové modelování. Dosažené kompresní poměry jsou velmi vysoké. Nicméně rychlost komprese i dekomprese je velmi nízká. Bohužel poslední vydání je z roku 2016 a aktivní vývoj již neprobíhá.
Srovnání různých metod
Srovnání probíhalo na datasetu Silesia, který sestával z následujících souborů.
Soubor | Popis | Typ dat | Velikost |
---|---|---|---|
dickens | Collected works of Charles Dickens | text | 9,72 MiB |
mr | Medical magnetic resonanse image | picture | 9,51 MiB |
ooffice | A dll from Open Office.org 1.01 | exe | 5,87 MiB |
osdb | Sample database in MySQL format | database | 9,62 MiB |
reymont | Text of the book CHŁOPI by W. Reymont | 6,32 MiB | |
sao | The SAO star catalog | bin data | 6,92 MiB |
xml | Collected XML files | html | 5,10 MiB |
x-ray | X-ray medical picture | image | 8,08 MiB |
Nyní se podívejme na srovnání maximálně dosaženého kompresního poměru (více je lépe).
dickens | mr | ooffice | osdb | reymont | sao | xml | x-ray | |
---|---|---|---|---|---|---|---|---|
lzop | 2.2803 | 2.4523 | 1.8408 | 2.3925 | 3.0753 | 1.2517 | 6.7689 | 1.2433 |
lz4 | 2.3244 | 2.3784 | 1.7391 | 2.5489 | 3.2072 | 1.2787 | 7.0204 | 1.1802 |
gzip | 2.6461 | 2.7138 | 1.9907 | 2.7138 | 3.6396 | 1.3613 | 8.0709 | 1.4035 |
zopfli | 2.7783 | 2.9060 | 2.0565 | 2.7966 | 3.9169 | 1.3847 | 8.5281 | 1.4756 |
rar | 3.2698 | 3.5758 | 2.6634 | 3.0469 | 4.2394 | 1.3068 | 10.7838 | 2.0164 |
lzma | 3.6006 | 3.6237 | 2.5351 | 3.5462 | 5.0383 | 1.6388 | 12.2943 | 1.8871 |
xz | 3.6000 | 3.6231 | 2.5346 | 3.5456 | 5.0374 | 1.6386 | 12.2910 | 1.8868 |
zstd | 3.5770 | 3.2103 | 2.3672 | 3.2550 | 4.9177 | 1.4502 | 11.7940 | 1.6436 |
brotli | 3.6044 | 3.5317 | 2.4818 | 3.5812 | 4.9747 | 1.5812 | 12.4145 | 1.8096 |
bzip2 | 3.6407 | 4.0841 | 2.1492 | 3.5984 | 5.3178 | 1.4678 | 12.1157 | 2.0918 |
bzip3 | 4.5625 | 4.7031 | 2.4346 | 4.4589 | 6.7591 | 1.5517 | 13.1697 | 2.3172 |
zpaq | 4.8656 | 4.5708 | 3.4825 | 4.5745 | 6.9285 | 1.8598 | 16.3486 | 2.3092 |
Co z tabulky vyčteme? Nástroj bzip3 je velmi efektivní. Ve většině případů ho ale překonal zpaq. Dále vidíme, že bzip2, brotli, zstd, lzma a xz jsou také slušně účinné. Pak tu máme Deflate, u kterého vidíme značný skok. Takže gzip ani Zopfli již dnes nejsou příliš účinné.
Pak tu máme LZ4 a lzop, u nichž vidíte, že mají velmi malý kompresní poměr, ale to je účel. My chceme, aby LZ4 byla velmi rychlá při kompresi a dekompresi za cenu méně účinné komprese. Všimněte si, která data se nám dobře komprimují. Je to hlavně soubor ve formátu XML, tedy HTML soubory, na nichž lze dosáhnout vysokého kompresního poměru. Ostatní soubory se komprimují o poznání hůře, ale typicky dosažitelný kompresní poměr je třeba 4,5.
Nyní se podíváme na rychlost dekomprese. Rychlost v následující tabulce je udána v MiB/s (více je lépe).
dickens | mr | ooffice | osdb | reymont | sao | xml | x-ray | |
---|---|---|---|---|---|---|---|---|
lzop | 264.8 | 357.4 | 252.8 | 421.8 | 311.3 | 352.8 | 490.1 | 291.7 |
lz4 | 665.7 | 699.1 | 592.6 | 745.6 | 658.3 | 606.6 | 717.9 | 585.6 |
gzip | 148.4 | 148.3 | 123.5 | 153.6 | 170.3 | 127.6 | 229.6 | 108.1 |
rar | 158.3 | 134.6 | 109.6 | 152.9 | 169.4 | 124.6 | 193.8 | 130.9 |
lzma | 70.3 | 53.6 | 37.6 | 55.7 | 92.1 | 24.5 | 170.4 | 26.7 |
xz | 71.1 | 53.0 | 37.6 | 55.5 | 89.6 | 24.6 | 163.3 | 25.9 |
zstd | 439.8 | 424.4 | 362.1 | 500.9 | 501.6 | 409.2 | 670.7 | 338.1 |
brotli | 263.4 | 206.2 | 152.3 | 231.2 | 329.1 | 129.0 | 439.4 | 121.8 |
bzip2 | 27.1 | 35.8 | 21.2 | 28.1 | 32.7 | 18.5 | 44.2 | 24.1 |
bzip3 | 6.8 | 6.8 | 7.0 | 6.6 | 7.2 | 5.7 | 16.2 | 7.1 |
zpaq | 3.3 | 4.0 | 3.1 | 3.0 | 3.0 | 2.3 | 4.0 | 2.9 |
Vidíte tady, že LZ4 je naprosto nepřekonatelný. Dekomprimuje ve stovkách megabajtů za sekundu. Dále zstd je taky slušně rychlý. Nakonec lzop a brotli jsou také celkem rychlé. Speciálně se ale podívejte na bzip3 a zpaq. Tyto dva nástroje byly naprosto nejúčinnější co se týče kompresního poměru, ale podívejte se, jak jsou pomalé.
Nakonec tu máme srovnání rychlosti komprese (MiB/s) se zaměřením na rychlost. Kompresní nástroje byly instruovány, aby komprese byla co nejrychlejší, i za cenu nízkého kompresního poměru. Opět platí, že více je lépe.
dickens | mr | ooffice | osdb | reymont | sao | xml | x-ray | |
---|---|---|---|---|---|---|---|---|
lzop | 231.4 | 306.7 | 255.0 | 331.6 | 274.7 | 256.1 | 509.7 | 808.1 |
lz4 | 441.8 | 559.3 | 366.6 | 565.7 | 351.1 | 406.8 | 509.7 | 621.6 |
gzip | 64.8 | 77.3 | 48.8 | 66.3 | 71.8 | 38.4 | 110.8 | 39.8 |
rar | 30.0 | 31.3 | 36.4 | 37.7 | 38.0 | 34.5 | 49.9 | 28.9 |
lzma | 3.3 | 2.4 | 4.1 | 4.0 | 3.1 | 4.3 | 3.3 | 4.9 |
xz | 20.6 | 14.8 | 19.7 | 27.9 | 16.8 | 21.8 | 13.3 | 29.3 |
zstd | 237.0 | 352.1 | 308.7 | 356.2 | 210.6 | 314.3 | 424.8 | 1010.2 |
brotli | 226.0 | 288.1 | 217.3 | 331.6 | 287.2 | 197.5 | 463.4 | 197.1 |
bzip2 | 13.8 | 19.5 | 12.1 | 14.2 | 15.2 | 12.0 | 12.9 | 14.2 |
bzip3 | 6.8 | 6.4 | 6.0 | 6.0 | 5.6 | 4.7 | 10.9 | 5.2 |
zpaq | 0.3 | 0.4 | 0.3 | 0.3 | 0.3 | 0.2 | 0.4 | 0.3 |
Tady můžeme vidět, že jasně vyhrává metoda LZ4 s několika stovkami megabajtů za sekundu. V jednom případě byla ale překonána metodou Zstd. Za zmínku stojí lzop, lz4, zstd a brotli, ale ostatní metody jsou pomalé. Suverénně nejpomalejší je bohužel nástroj zpaq.
Nejúčinnější je zpaq a bzip3
Závěrem můžeme říct, že zpaq a bzip3 jsou v současnosti nejúčinnější kompresory. Zopfli zlepší kompresní poměr proti gzipu o 3–8 %, přičemž používá stále stejnou kompresní metodu Deflate. Nástroje lzop, lz4 a gzip jsou relativně rychlé, ale s nízkým kompresním poměrem.
Metody LZMA, Zstd a Brotli dosahují relativně vysokých kompresních poměrů, nicméně bzip2, bzip3 a zpaq jsou ještě o něco účinnější. LZ4 má s náskokem nejrychlejší dekompresi (leč nízký kompresní poměr), Zstd je také poměrně rychlé. LZMA, bzip2, bzip3 a zpaq jsou při dekompresi hodně pomalé. Nástroje lze zaměřit na rychlost komprese (přinese snížený kompresní poměr) – tady vyhrává LZ4.
Zbývá dodat, že všechny zkomprimované soubory byly následně dekomprimovány a porovnány s originálem. Srovnání bylo měřeno na 32jádrovém procesoru AMD Ryzen Threadripper 2990WX. Byla použita jednovláknová komprese i dekomprese, i když některé nástroje umějí využít více vláken.