Snappy:高速を重視したデータ圧縮ライブラリ
Snappyは、
Googleによって開発されたオープンソースの
データ圧縮ライブラリです。その名の通り、高速な圧縮と展開処理に焦点を当てており、
LZ77アルゴリズムを基盤として
C++で実装されています。2011年に公開されて以来、多くのプロジェクトで使用されています。
性能と特徴
Snappyは、高い圧縮率よりも高速な処理速度を優先した設計となっています。そのため、gzipなどの一般的な圧縮アルゴリズムと比較すると、圧縮率はやや劣るものの、圧倒的な処理速度を実現しています。当時のCore i7プロセッサを用いたテストでは、250 MB/秒の圧縮速度と500 MB/秒の展開速度を記録しました。
Snappyの高速性は、いくつかの要因に起因します。まず、シンプルで効率的な圧縮アルゴリズムを採用している点です。複雑な
エントロピー符号化などは使用せず、基本的な
LZ77アルゴリズムをベースに、高速処理に最適化された実装がなされています。さらに、インラインアセンブラを最小限に抑え、移植性を高める工夫も施されています。
使用例と互換性
Snappyは、
Googleの内部システム(Bigtable、
MapReduce、RPCシステムなど)で広く利用されている他、様々なオープンソースプロジェクトにも採用されています。
MariaDB ColumnStore、
Apache Cassandra、Couchbase Server、
Apache Hadoop、LevelDB、
MongoDB、
RocksDB、Apache Lucene、
Apache Spark、InfluxDBなど、多くのデータベースや分散処理システムでSnappyによる
データ圧縮が利用されています。
ストリームフォーマット
Snappyのストリームフォーマットは、バイト指向で設計されています。
ハフマン符号や
算術符号などの
エントロピー符号化は使用しません。ストリームの先頭には、圧縮前のデータサイズがリトル
エンディアン形式で格納され、その後に圧縮データが続きます。圧縮データは、リテラルデータと、過去のデータからのコピーを組み合わせることで構成されています。コピーを表す際には、オフセットと長さを用いて、辞書からデータを参照します。辞書サイズはバージョンによって異なり、バージョン1.0では32,768バイト、バージョン1.1では65,536バイトに拡張されました。
エラー検出
展開処理においては、データの整合性を確認するためのエラー検出機構が組み込まれています。圧縮ストリームにエラーが含まれている場合、展開処理は失敗し、エラーが検出されます。
インタフェースと移植性
Snappyは
C++で記述されたリファレンス実装が提供されていますが、
C言語向けのラッパーも用意されています。さらに、多くのサードパーティによって様々なプログラミング言語へのバインディングが提供されており、C#、
Common Lisp、Crystal、
Erlang、Go、
Haskell、
Lua、
Java、
Nim、
Node.js、
Perl、PHP、
Python、R、
Ruby、Rust、Smalltalk、
OpenCLなど、幅広い言語環境で利用が可能です。
まとめ
Snappyは、高速性を重視した設計によって、多くのアプリケーションにおいて効率的な
データ圧縮を実現します。高い圧縮率が求められない場面においては、その高速性が大きなメリットとなります。シンプルな設計と高い移植性も相まって、様々なシステムやアプリケーションへの導入が容易です。ただし、圧縮率はgzipなど他のアルゴリズムに劣るため、用途に応じて適切な圧縮アルゴリズムを選択することが重要です。