Elegantní | |
---|---|
Typ | knihovna funkcí a program ke kombinaci [d] |
Vývojář | |
Zapsáno v | C++ |
Operační systém | multiplatformní |
První vydání | 18. března 2011 [1] [2] |
Nejnovější verze | |
Čitelné formáty souborů | elegantní |
Vygenerované formáty souborů | elegantní |
Licence | upravená licence BSD [d] [4] |
webová stránka | github.com/google/snappy |
Snappy (dříve Zippy ) [5] je knihovna pro rychlou kompresi a dekompresi dat napsaná v C++ u Google založená na LZ77 ; otevřena v roce 2011 [6] [7] [8] . Hlavním cílem bylo dosáhnout vysoké rychlosti komprese, přičemž nebyla nastavena nejvyšší komprese ani kompatibilita s jinými knihovnami. V roce 2011 dosáhla kompresní rychlost na jednom jádru Core i7 (2,26 GHz, 64 bitů) 250 MB/s a 500 MB/s pro dekompresi [8] , ale kompresní poměr se ukázal být 20 - 100 % nižší než gzip [9] .
Používá se v projektech Google, jako je BigTable , MapReduce a interní systém RPC , používaný ve sloupcovém enginu pro MariaDB [10] , Cassandra [11] , formáty souborů pro ekosystém Hadoop [12] , LevelDB [13] . MongoDB [14] , RocksDB [15] . Je vysoce přenosný, nepoužívá vložky assembleru .
Distribuováno jako obaly přes C a C++ ; rozhraní existují pro řadu dalších jazyků, včetně C# , Lisp , Erlang , Go , Haskell , Haxe , Java , Lua , Node.js , Perl , PHP , Python , R , Ruby , Rust , Smalltalk .
Kódování ve Snappy je bajt po bajtu, ve streamu mohou být pouze bajty. Formát se vyhýbá entropickému kódování pomocí Huffmanova algoritmu nebo aritmetického kódování podle potřeby.
První bajt v proudu definuje velikost nekomprimovaných dat uložených jako little endian "varint", tj. celé číslo v kódu s proměnnou délkou . Prvních sedm bitů každého bajtu se používá pro data a osmý bit je koncový příznak pro pole popisující tuto velikost.
Zbývající bajty proudu jsou zakódovány jako jeden ze čtyř typů prvků. Typ prvku je zakódován v prvních dvou bitech prvního bajtu (bajtu značky) prvku. [16]
Zápis: kód - odkaz na slovník; shift - posun z aktuální pozice zpět na již rozbalený stream; délka - počet bajtů kódu ze slovníku.
Velikost slovníku je omezena na bajty ( pro verzi 1.0).
Původní text:
Wikipedie je bezplatný, webový, spolupracující, vícejazyčný encyklopedický projekt.Komprimovaný stream:
0000000: ca02 f042 5769 6b69 7065 6469 6120 6973 ...BWikipedie jePrvní 2 bajty 0xCA02 jsou délka vyjádřená jako little-endian varint (viz také Protokolové vyrovnávací paměti pro specifikaci varint - celočíselná notace s proměnnou délkou), takže nejvýznamnější byte je zde 02. 0x02CA(pohled LE) = 0x014A= 330 bajtů. Další dva bajty 0xF042označují, že stejný literál bude následovat na pozici 66+1
0000010: 2061 2066 7265 652c 2077 6562 2d62 6173 bezplatný web-bas 0000020: 6564 2c20 636f 6c6c 6162 6f72 6174 6976ed, spolupracující 0000030: 652c 206d 756c 7469 6c69 6e67 7561 6c20 e, vícejazyčný 0000040: 656e 6379 636c 6f 09 3f f0 14 70 726f 6a65 encyklopedie.?.proje0x09 je bajt značky typu 01s délkou 4 bitů a offsetem 0x3F== 63 10 nebo "pedia"; 0xf014 je literál o délce 20+1 bajtů
0000050: 6374 2e00 0000 0000 0000 0000 0000 0000 ct.V tomto příkladu byla všechna opakování podřetězce čtyř nebo více znaků eliminována procesem komprese. Většina ostatních knihoven dokáže tento příklad komprimovat lépe. Na rozdíl od klasických archivátorů gzip nebo bzip2 nepoužívá Snappy entropické kódování (jako je Huffmanův kód ) a nepřebaluje abecední znaky do kompaktnějších bitových sekvencí podle frekvence jejich výskytu.