BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース SuperPack - ペイロードの小さな新しいシリアライズフォーマット

SuperPack - ペイロードの小さな新しいシリアライズフォーマット

原文(投稿日:2016/08/27)へのリンク

Shape SecuritySuperPackという,スキーマレスの新しいバイナリシリアライズフォーマットをオープンソースとして公開した。

SuperPackでは,ペイロードサイズを削減する目的でバイナリシリアライズフォーマットを使用している。他のスキーマレスフォーマットと比較した場合,ShapeSecurityによると,SuperPackは,特定の4.48KBのサンプルフォーマットでのペイロードが最小である。

 

オリジナルメッセージ

YAML

BSON

JSON

Sereal

SuperPack

非圧縮

4.769 B 

134%

111%

69%

40%

28%

圧縮

4.769 B 

14%

20%

12%

16%

13%

YAMLとBSONはメッセージペイロード以外について,かなり冗長である。JSONはYAMLよりはよいのだが,テキストエンコーディング形式であるため,SuperPackよりもかなり大きくなっている。gzip圧縮後の値はかなり異なり,YAML, JSON, SuperPackはオリジナルメッセージの12~14%で拮抗している。

SuperPackのようなエンコードフォーマットを使用するメリットのひとつは,事前にメッセージスキーマを交換しておかなくても,クライアントとの通信が可能なことだ。データタイプ情報はペイロードに含まれている。SuperPackには,一般的なtrue, false, uint16, uint32, float32に加えて,それ程一般的ではない uint6, nint4, array5を含む36のデータタイプが前もって定義されている。後者はメッセージで使用される確率の高い値を表現するためのものだ。

配列や文字列,マップも含まれている。タイプのひとつであるextensionでは,ユーザが新たなタイプを追加することができる。SuperPackには,繰り返し文字列繰り返しキーセット2つの最適化がオプションとして用意されており,特定ケースでのペイロードの削減が可能になっている。

我々は同社の研究員でFOSSコーディネータのMichael Ficarra氏から,SuperPackについて詳細を聞くことにした。

InfoQ: 他のスキーマレスフォーマットよりもエンコードサイズを小さくするために,具体的にはどのようなことが行われているのでしょう?

Michael Ficarra: SuperPackの前提にあるのは,事前にデータのスキーマを予想できない場合でも,データには何度も繰り返される構造や値が存在する可能性が高い,という思想です。例として,買い主と猫をマップする“cats”というデータ構造があるとします。すべての猫の情報をエンコードしなくても,名前や誕生日,好きな食べ物といった情報があるという事実から,この情報を一度エンコードすれば,それを参照することで,protobuff形式の値のパッキングを極めて効率的に行なうことができます。

さらに,他に比べて頻度の高い値については,効率的な表現を行なう必要があります。フォーマットを詳細に見て頂けば,すべての値が,私たちが”タイプタグ”と呼んでいる1バイトのインジケータから始まっていることが分かります。このタイプタグには,すべての値あるいは一部の値を,その中に直接エンコードできるような領域が確保されています。単純な例はbooleanタイプタグで,1つの値は真であり,もうひとつは偽です。同じように”uint6”には64のタイプタグがあって,0から63までの値を1バイトで表現することができます。また,エントリ数が32未満の配列(長さとエントリをエンコードする必要がある)は,長さをタグ内にエンコードすることができます。先程の例に戻ると,猫のひげ(whisker)は普通64本未満ですし,大部分の買い主が飼う猫の数は32匹未満ですから,これらの値は効率的にエンコードできます。

InfoQ: Protocol Buffersなど他のスキーマ駆動のバイナリフォーマットとの比較は行なっていますか?Protobufのペイロードはかなり小さいのでしょうか?

Ficarra: そのような比較はしていません。SuperPackの文字列の重複排除機能が特に有効な場合を除けば,ほとんどの場合,Protobufの方が小さいだろうと思います。スキーマ駆動フォーマットが使用可能なニーズについては,特にLZWやDeflateのようなロスレスデータ圧縮アルゴリズムが併用可能であれば,そのメリットを活用した方がよいでしょう。

InfoQ: メッセージのエンコード/デコードに必要な処理時間という面ではどうでしょう?

Ficarra: エンコード時間は,キーセットあるいは文字列の重複を除外する最適化が選択(あるいは指定)されたかどうかによって異なります。すべての数値にIEEE 754倍精度数を使用するJavaScriptのように,実装言語に起因するパフォーマンス上の問題もあります。

InfoQ: 他の言語のサポートを追加する予定はありますか?

Ficarra: もちろんです!Javaの実装は,Shape Security社内で使用しています。オープンソースとして公開する準備はまだできていませんが,ニーズはあると聞いているので,そのプロセスを進めています。それ以外のエコシステムに着手したいコミュニティがあれば,私たちは喜んでお手伝いします。Rustの実装などは面白そうですね!

SuperPackはまだ非常に若い,ということも付け加えておきたいと思います。向上を実現できる提案があれば,ぜひお聞きしたいと思っています。まずは仕様のイシュートラッカのイシューをオープンしてください。SuperPackの将来のバージョンが,さらによいものになればと願っています!

現在のSuperPackにはJavaScriptトランスコーダが付属しているが,これを起点として他のものを開発することができる。SuperPackは非常に寛容なライセンス下で,オープンソースとして公開されている。

 
 

この記事を評価

関連性
スタイル
 
 

この記事に星をつける

おすすめ度
スタイル

BT