Snappy (compression)

From Wikipedia, the free encyclopedia
Jump to navigation Jump to search
Snappy
Original author(s) Jeff Dean, Sanjay Ghemawat, Steinar H. Gunderson
Developer(s) Google
Initial release March 18, 2011 (2011-03-18)
Stable release
1.1.6 / July 13, 2017; 14 months ago (2017-07-13)[1]
Repository Edit this at Wikidata
Written in C++
Operating system Cross-platform
Platform Portable
Size 2 MB
Type data compression
License Apache 2 (up to 1.0.1)/New BSD
Website google.github.io/snappy/

Snappy (previously known as Zippy) is a fast data compression and decompression library written in C++ by Google based on ideas from LZ77 and open-sourced in 2011.[2][3] It does not aim for maximum compression, or compatibility with any other compression library; instead, it aims for very high speeds and reasonable compression. Compression speed is 250 MB/s and decompression speed is 500 MB/s using a single core of a circa 2011 "Westmere" 2.26 GHz Core i7 processor running in 64-bit mode. The compression ratio is 20–100% lower than gzip.[4]

Snappy is widely used in Google projects like Bigtable, MapReduce and in compression data in Google's internal RPC systems. It can be used in open-source projects like MariaDB ColumnStore,[5] Cassandra, Hadoop, LevelDB, MongoDB, RocksDB, Lucene.[6] Decompression is tested to detect any errors in the compressed stream. Snappy does not use inline assembler (except some optimizations[7]) and is portable.

Stream format[edit]

Snappy encoding is not bit-oriented, but byte-oriented (only whole bytes are emitted or consumed from a stream). The format uses no entropy encoder, like Huffman tree or arithmetic encoder.

The first bytes of the stream are the length of uncompressed data, stored as a little-endian varint, which allows for variable-length encoding. The lower seven bits of each byte are used for data and the high bit is a flag to indicate the end of the length field.

The remaining bytes in the stream are encoded using one of four element types. The element type is encoded in the lower two bits of the first byte (tag byte) of the element:[8]

  • 00 – Literal – uncompressed data; upper 6 bits are used to store length of data; if the length of data is more 60 bytes, additional variable-length encoding is added
  • 01 – Copy with length stored as 3 bits and offset stored as 11 bits; one byte after tag byte is used for part of offset;
  • 10 – Copy with length stored as 6 bits of tag byte and offset stored as two-byte integer after the tag byte;
  • 11 – Copy with length stored as 6 bits of tag byte and offset stored as four-byte little-endian integer after the tag byte;

The copy refers to the dictionary (just-decompressed data). The offset is the shift from the current position back to the already decompressed stream. The length is the number of bytes to copy from the dictionary. The size of the dictionary was limited by the 1.0 Snappy compressor to 32768 bytes, and updated to 65536 in version 1.1.

Example of a compressed stream[edit]

The text

Wikipedia is a free, web-based, collaborative, multilingual encyclopedia project.

may be compressed to this, shown as hex data with explanations:

0000000: ca02 f042 5769 6b69 7065 6469 6120 6973  ...BWikipedia is

The first 2 bytes, ca02 are the length, as a little-endian varint (see Protocol Buffers for the varint specification). Thus the most-significant byte is '02' . 0x02ca(varint) = 0x014a = 330 bytes. The next two bytes, 0xf042, indicate that a literal of 66+1 bytes follows

0000010: 2061 2066 7265 652c 2077 6562 2d62 6173   a free, web-bas
0000020: 6564 2c20 636f 6c6c 6162 6f72 6174 6976  ed, collaborativ
0000030: 652c 206d 756c 7469 6c69 6e67 7561 6c20  e, multilingual
0000040: 656e 6379 636c 6f09 3ff0 8101 7072 6f6a  encyclo.?...proj

0x09 is tag-byte of type 01 with length - 4 = 0102 = 210 and offset = 0x03f = 63 or "pedia ";
0xf08101 is a literal with length of 129+1 bytes

0000050: 6563 742e 0000 0000 0000 0000 0000 0000  ect.

In this example, all common substrings with four or more characters were eliminated by the compression process. More common compressors can compress this better. Unlike compression methods such as gzip and bzip2, there is no entropy encoding used to pack alphabet into the bit stream.

Interfaces[edit]

Snappy distributions include C++ and C bindings. Third party-provided bindings and ports include:[9]

See also[edit]

References[edit]

  1. ^ "Releases - google/snappy". Retrieved 31 July 2017 – via GitHub.
  2. ^ "Google Snappy–A Fast Compressing Library". InfoQ. Retrieved August 1, 2011.
  3. ^ Google open sources MapReduce compression. In the name of speed // The Register, 2011-03-24
  4. ^ "Snappy: A fast compressor/decompressor: Readme". Google Code. Archived from the original on September 8, 2015. Retrieved August 1, 2011."Snappy vs lzo vs zlib".
  5. ^ https://mariadb.com/kb/en/mariadb/columnstore-storage-architecture/#compression-mode
  6. ^ snappy. A fast compressor/decompressor - Project page at Google Code
  7. ^ Commit: Add a loop alignment directive to work around a performance regression
  8. ^ https://github.com/google/snappy/blob/master/format_description.txt
  9. ^ https://google.github.io/snappy/

External links[edit]