Download - snappyについて
snappyについて
1
snappy
•Googleが2011/04 にオープンソース化したデータ圧縮ライブラリ。(new BSD License)
•そこそこの圧縮率だが高速に圧縮~伸長が行える。•昔はZippyと言われていたらしい
2
なぜsnappyのようなものが必要か?
•データの圧縮ってそんなに必要なの?→必要です(キリッ日々無尽蔵に増えていくデータの効率的な管理は大事。有限なリソースの有効活用は死活問題。(diskスペース、i-node...)
3
なぜsnappyのようなものが必要か?
•圧縮率は高ければ高い方がよくない?→ケースバイケースだが、圧縮率が高いアルゴリズムは概ね処理コストも高い(処理時間が長い)。処理速度が速い方が使いやすいケースもある。
4
他アルゴリズムとの比較
•以下の有名なアルゴリズムと比較•gzip(deflate)• みんな大好きな有名なアレ• lzo• snappy以外で高速な圧縮~伸張が特徴なアルゴリズム
•snappy•snappy付属のデータで検証
5
gzip vs lzo vs snappy
6
gzip vs lzo vs snappy
gzipの圧縮率が高い。lzoとsnappyはだいたい同じ
7
gzip vs lzo vs snappy
8
lzo(圧縮速い)
gzip vs lzo vs snappy
9
snappy(伸長速い)
gzip vs lzo vs snappy
10
gzip(・・・)
gzip vs lzo vs snappy
11
•gzipは圧縮率高いけれど遅い• lzoとsnappyはほぼ同じ傾向(圧縮率そこそこだけど高速)
•そのなかでも・・・• 圧縮率はLZOが高め(ほぼ同じ)• 圧縮速度でもLZOが速い• ただし伸長速度はsnappyが速い→snappyは特に伸長速度の速さを考えられて作られたアルゴリズムっぽい
gzip vs lzo vs snappy
12
•BigTableに保存する時のデータ圧縮に使われているらしい。• 書き込み(圧縮)よりも読み込み(伸長)の頻度が圧倒的に高い。• データを効率的に保存し、かつ必要なときにすぐ復元したい、という需要に答えるために作られたのでは。
snappyのユースケース
13
圧縮の仕組み
14
•ランレングス(Run Length Encoding)
• 「AAAAABBBBCCC」→「A5B4C3」•ハフマン符号(Huffman Coding)
• 出現数の多いデータに短い符号、少ないデータに大きい符号を割り当てる
•辞書式圧縮(Dictionary Coding)
• 過去に出現したデータパターンを辞書として、次に同じものが出現したらポインタに置き換える
よく知られる圧縮の仕組み
15
•gzip(deflate)• LZSS(辞書式圧縮)+動的ハフマン符号•snappy• 辞書式圧縮+α
実際に採用されているもの
16
• ハッシュテーブルを使って辞書を管理• 4byteのsliding windowを用いてデータをシーク。データがハッシュテーブルに無いか探す• ハッシュが一致する場合は、そこからどのくらいの長さデータが一致しているのかを計算
• 一致するデータがなかなか出現しない場合はデータをすっ飛ばす。(32回未出現ごとに移動幅を1ずつ増やす)
snappyアルゴリズムの特徴
17
snappyアルゴリズムの特徴
http://www.slideshare.net/KeigoMachinaga/snappy-servay-8665889 より引用18
• sliding window幅、ハッシュテーブルともコンパクト。高速な一次領域(CPUキャッシュなど)を有効活用できるから速い?• 基本的にハフマン符号化は使わずに辞書式圧縮だけだから速い?• なかなか圧縮できない時は割りきってデータをすっ飛ばすので速い?• その他諸々のテクニックのお陰で速い?
snappyアルゴリズムの特徴
19
対応言語
•C/C++•Java(JNI経由呼び出し)•Perl/Python/Ruby•Erlang/Haskell•Node.js
20
まとめにかえて
•snappyはそこそこ圧縮率があって圧縮伸張速度が速い、非常に実践的で使いやすいアルゴリズムです。•興味のある方は試してみてください。
21