Snappy | |
---|---|
Sorts | funktionsbibliotek och program för att kombinera [d] |
Utvecklaren | |
Skrivet i | C++ |
Operativ system | plattformsoberoende |
Första upplagan | 18 mars 2011 [1] [2] |
senaste versionen | |
Läsbara filformat | pigg |
Genererade filformat | pigg |
Licens | modifierad BSD-licens [d] [4] |
Hemsida | github.com/google/snappy |
Snappy (tidigare Zippy ) [5] är ett snabbt datakomprimerings- och dekompressionsbibliotek skrivet i C++ hos Google baserat på LZ77 ; öppnade 2011 [6] [7] [8] . Huvudmålet var att uppnå en hög komprimeringshastighet, medan den högsta komprimeringen eller kompatibiliteten med andra bibliotek inte var inställd. 2011 nådde komprimeringshastigheten på en enda Core i7-kärna (2,26 GHz, 64 bitar) 250 MB/s och 500 MB/s för dekompression [8] , men kompressionsförhållandet visade sig vara 20 - 100 % lägre än gzip [9] .
Används i Google-projekt som BigTable , MapReduce och internt RPC- system , används i kolumnmotor för MariaDB [10] , Cassandra [11] , filformat för Hadoop -ekosystem [12] , LevelDB [13] . MongoDB [14] , RocksDB [15] . Är mycket bärbar, använder inte assembler-insatser .
Distribueras som omslag över C och C++ ; gränssnitt finns för ett antal andra språk, inklusive C# , Lisp , Erlang , Go , Haskell , Haxe , Java , Lua , Node.js , Perl , PHP , Python , R , Ruby , Rust , Smalltalk .
Kodning i Snappy sker byte för byte, det kan bara finnas byte i strömmen. Formatet undviker entropikodning , med hjälp av Huffman-algoritmen eller aritmetisk kodning som är lämpligt.
Den första byten i strömmen definierar storleken på okomprimerad data, lagrad som en liten endian "varint", dvs ett heltal i kod med variabel längd . De första sju bitarna av varje byte används för data, och den åttonde biten är slutflaggan för fältet som beskriver den storleken.
De återstående byten i strömmen är kodade som en av fyra elementtyper. Elementtypen kodas i de två första bitarna av elementets första byte (taggbyte). [16]
Notation: kod - länk till ordboken; shift - skift från den aktuella positionen tillbaka till den redan uppackade strömmen; längd - antalet byte kod från ordboken.
Ordbokens storlek är begränsad till byte ( för version 1.0).
Original text:
Wikipedia är ett gratis, webbaserat, samarbetande, flerspråkigt uppslagsverk.Komprimerad ström:
0000000: ca02 f042 5769 6b69 7065 6469 6120 6973 ...BWikipedia ärDe första 2 byten 0xCA02 är längden, uttryckt som en liten endian varint (se även Protocol Buffers för specifikationen av varint - variabel längd heltalsnotation), så den mest signifikanta byten här är 02. 0x02CA(LE-vy) = 0x014A= 330 byte. De kommande två byten 0xF042indikerar att samma bokstav kommer att följa vid position 66+1
0000010: 2061 2066 7265 652c 2077 6562 2d62 6173 en gratis, webbaserad 0000020: 6564 2c20 636f 6c6c 6162 6f72 6174 6976ed, collaborativ 0000030: 652c 206d 756c 7469 6c69 6e67 7561 6c20 e, flerspråkig 0000040: 656e 6379 636c 6f 09 3f f0 14 70 726f 6a65 encyclo.?.proje0x09 är en typtaggbyte 01med en längd på 4 bitar och offset 0x3F== 63 10 eller "pedia "; 0xf014 är en bokstavlig med en längd på 20+1 byte
0000050: 6374 2e00 0000 0000 0000 0000 0000 0000 ct.I exemplet har alla upprepningar av en delsträng med fyra eller fler tecken eliminerats av komprimeringsprocessen. De flesta andra bibliotek kan komprimera detta exempel bättre. Till skillnad från klassiska gzip- eller bzip2-arkiverare använder Snappy inte entropikodning (som Huffman-kod ) och packar inte om alfabetiska tecken till mer kompakta bitsekvenser enligt deras frekvens.