| 原作者 | ジェフ・ディーン、サンジェイ・ゲマワット、スタイナー・H・ガンダーソン |
|---|---|
| 開発者 | グーグル |
| 初回リリース | 2011年3月18日 |
| 安定リリース | 1.1.10 / 2023年3月9日[1] |
| リポジトリ |
|
| 書かれた | C++ |
| オペレーティング·システム | クロスプラットフォーム |
| プラットフォーム | ポータブル |
| サイズ | 1.1MB |
| タイプ | データ圧縮 |
| ライセンス | Apache 2 (1.0.1 まで)/ New BSD |
| Webサイト | google.github.io/snappy/ |
| ファイル名拡張子 |
.sz |
|---|---|
| インターネットメディアの種類 |
アプリケーション/x-snappy-framed |
| 魔法の数字 | ff 06 00 00 73 4e 61 50 70 59(FF 06 00 00 "sNaPpY") |
| フォーマットの種類 | データ圧縮 |
| オープンフォーマット? | はい |
| フリーフォーマット? | はい |
| Webサイト | github.com/google/snappy/blob/main/framing_format.txt |
Snappy(旧称Zippy)は、LZ77のアイデアに基づいてGoogleがC++で記述し、2011年にオープンソース化した高速データ圧縮および解凍ライブラリです。 [3] [4]最大限の圧縮や他の圧縮ライブラリとの互換性を目指しているわけではありません。代わりに、非常に高速で妥当な圧縮を目指しています。圧縮速度は250 MB/秒、解凍速度は、 64ビットモードで動作する2011年頃の「Westmere」2.26 GHz Core i7プロセッサのシングルコアを使用した場合、500 MB/秒です。圧縮率はgzipよりも20~100%低くなります。[5]
SnappyはBigtable、MapReduceなどのGoogleプロジェクトや、Googleの内部RPCシステムのデータ圧縮に広く使用されています。MariaDB ColumnStore、[6] Cassandra、Couchbase、Hadoop、LevelDB、MongoDB、RocksDB、Lucene、Spark、InfluxDB、[7] Cephなどのオープンソースプロジェクトで使用できます。[ 8] FirefoxはlocalStorageのデータを圧縮するためにSnappyを使用しています。[9]圧縮されたストリームでエラーを検出するために解凍がテストされています。Snappyはインラインアセンブラを使用せず(一部の最適化[10]を除く)、移植可能です。
ストリーム形式
Snappy エンコーディングはビット指向ではなく、バイト指向です (ストリームからバイト全体のみが出力または消費されます)。この形式では、ハフマン コーディングや算術コーディングのようなエントロピー エンコーダーは使用されません。
ストリームの最初のバイトは圧縮されていないデータの長さで、リトルエンディアンの可変長整数[11]として保存されます。可変長 コードの使用を可能にするセクション1。 各バイトの下位7ビットはデータに使用され、上位ビットは長さフィールドの終わりを示すフラグです。
ストリームの残りのバイトは、4つの要素型のいずれかを使用してエンコードされます。要素型は、要素の最初のバイト(タグバイト)の下位2ビットにエンコードされます。 [12]
- 00 –リテラル– 非圧縮データ。上位 6 ビットはデータの長さ (len-1) を格納するために使用されます。60 より大きい長さは、60 (1 バイト) から 63 (4 バイト) までの 6 ビットの長さで示される 1 ~ 4 バイトの整数に格納されます。
- 01 – 長さが 3 ビット、オフセットが 11 ビットで保存されたコピー。タグ バイトの後の 1 バイトはオフセットの一部に使用されます。
- 10 – 長さがタグ バイトの 6 ビットとして格納され、オフセットがタグ バイトの後の 2 バイトの整数として格納されたコピー。
- 11 – 長さがタグ バイトの 6 ビットとして格納され、オフセットがタグ バイトの後の 4 バイトのリトルエンディアン整数として格納されたコピー。
コピーは辞書(解凍されたばかりのデータ)を参照します。オフセットは、現在の位置からすでに解凍されたストリームへのシフトです。長さは、辞書からコピーするバイト数です。辞書のサイズは、1.0 Snappy コンプレッサによって 32,768 バイトに制限されていましたが、バージョン 1.1 では 65,536 に更新されました。[引用が必要]
Snappy形式の完全な公式説明は、Google GitHubリポジトリにあります。[11]
圧縮ストリームの例
テキスト
Wikipedia は、無料の Web ベースの共同作業型多言語百科事典プロジェクトです。
次のように圧縮され、説明付きの 16 進データとして表示されます。
000000 51 f0 42 57 69 6b 69 70 65 64 69 61 20 69 73 20 >Q.BWikipediaは< 000010 61 20 66 72 65 65 2c 20 77 65 62 2d 62 61 73 65 >無料のウェブベース< 000020 64 2c 20 63 6f 6c 6c 61 62 6f 72 61 74 69 76 65 >d、共同< 000030 2c 20 6d 75 6c 74 69 6c 69 6e 67 75 61 6c 20 65 >、多言語 e<
ストリームは、非圧縮データの長さをvarint [11] : section 1 として開始します。したがって、上位ビットがクリアされた最初のバイトは、51 16 =81バイトの長さに相当します。
最初のブロックはリテラルでなければならず、f042がそれに対応します。最初のバイトは次のように分解されます。f0 16 ⇒ len−1=111100 2 ;type=00 2 ;type 0はリテラルを意味し、length−1が111100 2 =60の場合は、次のバイトから長さが読み取られることを意味します。この場合は42 16 =66です。テキストの最初の66バイト(「Wikipediaは、無料で利用できるWebベースの共同作業型多言語百科事典です」)が続きます。[11] : 2.1
000040 6e 63 79 63 6c 6f 09 3f 1c 70 72 6f 6a 65 63 74 >ncyclo.?.project< 000050 2e >.<
次のブロックのヘッダーは093fで構成され、 09 16 ⇒ off h =000 2、len−4=010 2、type=01 2と分解されます。type 1 は「1バイトオフセット付きコピー」を示します。コピーする長さは 010 2 +4=6 バイトとなり、オフセットは 11 ビットの整数で、その上位ビットは off h、下位ビットは次のバイト3fとなるため、{off h }{3f 16 }=00000111111 2 =63 となります。[11] : 2.2、2.2.1
これは、63 バイト前から 6 バイトをコピーすることを意味します。すでに 67 バイトがコピーされているため、位置 4 (5 番目のバイトから) から 6 バイトをコピーすることと評価され、「pedia」が生成されます。
このブロックには他に内容がないので、次のブロックはすぐに始まります – 1c 16 ⇒ len−1=000111 2 ;type=00 2 、つまり長さ000111 2 +1=8のリテラルです。[11] : 2.1 テキストの最後の部分(「プロジェクト」)が続きます。
この例では、4 文字以上の共通部分文字列はすべて圧縮プロセスによって削除されました。より一般的な圧縮ツールでは、これをより適切に圧縮できます。gzip や bzip2 などの圧縮方法とは異なり、アルファベットをビット ストリームにパックするために エントロピー エンコーディングは使用されません。
フレーミングフォーマット
Snappyストリームは、最大4GiB−1の全体サイズの入力をサポートしています。[11] :セクション1。 圧縮されていない、または不十分に圧縮されているセクション、自己識別できないセクション、単純な出力サイズチェック以外のデータ整合性メカニズムがないセクションには、大きなオーバーヘッドが追加される可能性があります。
これらの問題に対処するために、Snappyフレーミングフォーマット[2]「Snappyフレーム」が使用される場合があります。これは、入力を最大64KiBのチャンクに分割し、[2] :4.2、4.34 バイトのブロックヘッダー(1バイトの識別子と3バイトの長さ)で区切られます。[2] :セクション1
- FF 16型の「ストリーム識別子」はストリームを開始し、ASCIIの「sNaPpY」のみで構成されていなければならない。[2] : 4.1
- タイプ0の「圧縮データ」には、圧縮されたSnappyストリームが含まれています。[2] : 4.2
- タイプ1の「非圧縮データ」には、そのまま出力にコピーするデータが含まれています。[2] : 4.3
どちらのタイプのデータ チャンクにも、圧縮されていないデータの CRC-32Cチェックサムが含まれています。
タイプ2-7F 16のチャンクは予約されており、必ずエラーが発生します。[2] : 4.5 タイプ80 16 -FE 16のチャンクは、それを理解できない解凍プログラムによって無視される場合があります。[2] : 4.4,4.6
インターフェース
SnappyディストリビューションにはC++とCのバインディングが含まれています。サードパーティが提供するバインディングとポートには[13] C#、Common Lisp、Crystal(プログラミング言語)、Erlang、Go、Haskell、Lua、Java、Nim、Node.js、Perl、PHP、Python、R、Ruby、Rust、Smalltalk、OpenCLなどがあります。[14] [15] コマンドラインインターフェースプログラムも利用可能です。[16]
参照
参考文献
- ^ 「リリース - google/snappy」。2023年10月4日閲覧– GitHub経由。
- ^ abcdefghi 「Snappyフレーミングフォーマットの説明」。GitHub。2021年10月26日。
- ^ 「Google Snappy – 高速圧縮ライブラリ」。InfoQ。2011年8 月 1 日閲覧。
- ^ Google が MapReduce 圧縮をオープンソース化。スピードの名の下に // The Register、2011-03-24
- ^ 「Snappy: 高速コンプレッサー/デコンプレッサー: Readme」。Google Code。2015年9月8日時点のオリジナルよりアーカイブ。 2011年8月1日閲覧。「Snappy vs lzo vs zlib」。
- ^ 「ColumnStore ストレージ アーキテクチャ」。MariaDBナレッジベース。
- ^ snappy。高速な圧縮/解凍ソフト - Google Code のプロジェクト ページ
- ^ 「圧縮 — Ceph ドキュメント」。2024年 1 月 3 日閲覧。
- ^ 「SnappyUtils.cpp - mozsearch」。2024年1月3日閲覧。
- ^ 「パフォーマンスの低下を回避するためにループ アライメント ディレクティブを追加します。 · google/snappy@824e671」。GitHub。
- ^ abcdefg 「Snappy圧縮形式の説明」。GitHub 。 2021年10月26日。
- ^ 「GitHub - google/snappy: 高速コンプレッサー/デコンプレッサー」。2019 年 11 月 11 日 – GitHub 経由。
- ^ 「スナッピー」。スナッピー。
- ^ 「ザイリンクス」。ザイリンクス。
- ^ 「InAccel」. InAccel .
- ^ 「snappy-tools: snappy(1): フレーミングありとなしのSnappy圧縮と解凍」。sourcehut 。 2024年2月15日閲覧。
外部リンク
- スナッピーメーリングリスト
