見出し画像

🌐FlatBuffersとProtocol Buffersの違い


https://amzn.to/3dPDJ7S

プロトコルバッファはFlatBuffersと比較的似ていますが、

FlatBuffersではデータにアクセスする前に2次表現へのパース/アンパックのステップが不要で、しばしばオブジェクトごとのメモリ割り当てと結合される点が主に異なっています。コードも一桁大きくなっています。Protocol Buffersにはオプションでテキストのインポート/エクスポートはありません。

JSONとの比較

JSONは非常に読みやすく(だから私たちはオプションのテキスト形式としてJSONを使用しています)、動的型付け言語(JavaScriptなど)と一緒に使用すると非常に便利です。しかし、静的型付け言語からデータをシリアライズする場合、JSONは実行時の効率が悪いという明らかな欠点があるだけでなく、動的型付けシリアライズシステムのために、データにアクセスするために(直感に反して)多くのコードを書かなければならなくなるのです。
TensorFlow Liteは、ネットワークモデルのデータシリアライズ形式としてFlatBuffersを採用しており、標準的なTensorFlowモデルで採用されているProtocol Buffers形式は採用していない。

FlatBuffersは、Protocol Buffers、Thrift、Apache Avro、SBE、Cap'n Protoに似たシリアル化フォーマットを実装したフリーソフトウェアライブラリで、主にWouter van Oortmerssen氏によって開発され、Googleによってオープンソース化されています。

Cap'n ProtoやSBEと同様に「ゼロコピー」デシリアライゼーションをサポートしており、シリアル化されたデータにアクセスする際に、最初にメモリの別の部分にコピーする必要がありません。このため、これらのフォーマットのデータへのアクセスは、JSONやCSV、そして多くの場合プロトコルバッファのような、より広範な処理を必要とするフォーマットのデータよりもはるかに高速です。

シリアル化されたフォーマットにより、すべてのデータを解析することなく、特定のデータ要素(例えば、個々の文字列や整数のプロパティ)にランダムにアクセスすることができます。可変長の整数を使用するプロトコルバッファとは異なり、FlatBuffersでは整数をネイティブサイズでエンコードするため、パフォーマンスに有利ですが、エンコードされた表現が長くなります。

スキーマは名前空間宣言から始まります。これは生成されるコードに対応するパッケージ/名前空間を決定するものです。この例では、MyGame ネームスペースの中に Sample ネームスペースがあります。

FlatBuffersとProtocol Buffers(Protobuf)は、両方ともGoogleが開発したデータのシリアライズ(直列化)形式で、ネットワーク経由でのデータの送受信やファイルへのデータの保存などで使用されます。しかし、その特性と利用場面にはいくつか違いがあります。

  1. Protocol Buffers (Protobuf): Protocol Buffersは、効率的で拡張可能なメカニズムを提供し、構造化データを簡単にシリアライズ(直列化)できるように設計されています。それはバイナリ形式であり、シリアライズとデシリアライズの過程で一部のCPUリソースを消費しますが、生成されるデータは通常小さく、またネットワーク経由で送信する際の帯域幅も少なくて済みます。また、異なるデータ構造間で互換性を保つための機能も提供しています。

  2. FlatBuffers: FlatBuffersもまた、Protocol Buffersと同様にデータをシリアライズするためのものですが、その主な特徴は「ゼロコピー」のデシリアライズです。FlatBuffersが生成するデータはメモリに直接マッピングされ、そのデータを解析するためにはデータのコピーを作成する必要がありません。これにより、デシリアライズの過程でのCPUリソースの使用を削減し、パフォーマンスを向上させることができます。また、生成されるデータは通常Protobufよりも大きいですが、高速なアクセスが必要なゲーム開発やリアルタイムシステムなどでは、その性能の利点が活かされます。

  1. インストール: まず、FlatBuffersコンパイラとランタイムライブラリをインストールします。GitHubのFlatBuffersリポジトリからソースコードをダウンロードしてビルドするか、パッケージマネージャー(例: apt-getbrewvcpkg など)を使ってインストールできます。

  2. スキーマ定義: データ構造を定義するためのスキーマファイル(.fbsファイル)を作成します。このファイルには、シリアル化/デシリアル化するためのテーブル、構造体、および他のデータタイプが定義されます。

namespace MyGame.Sample;

table Monster {
  pos:Vec3;
  mana:int;
  hp:int;
  name:string;
  friendly:bool;
  inventory:[ubyte];
}

root_type Monster;

コード生成: FlatBuffersコンパイラ(flatc)を使って、スキーマファイルからターゲット言語のコードを生成します。

FILEはスキーマ(末尾は.fbsでなければならない)、バイナリー・スキーマ(末尾は.bfbsでなければならない)、JSONファイル(直前のスキーマに準拠)である。の後のBINARY_FILEは、バイナリー・フラットバッファー形式のファイルでなければなりません。
出力ファイルは入力のベース・ファイル名を使って命名され、カレント・ディレクトリか-oで与えられたパスに書き出される。

https://www.mankier.com/1/flatc

--binary,  -b
任意のデータ定義に対してワイヤーフォーマットのバイナリーを生成する。

--json, -t
データ定義に対してテキスト出力を生成する。

--cpp, -c
テーブル/構造体の C++ ヘッダーを生成する。

--go, -g
テーブル/構造体のGoファイルを生成する。

--java, -j
テーブル/構造体用のJavaクラスを生成する。

--dart, -d
テーブル/構造体に Dart クラスを生成する。

--ts, -T
テーブル/構造体にTypeScriptコードを生成する。

--csharp, -n
テーブル/構造体用の C# クラスを生成する。

--python, -p
テーブル/構造体用の Python ファイルを生成する。

--lobster
テーブル/構造体用の Lobster ファイルを生成する。

--lua, -l
テーブル/構造体用のLuaファイルを生成する。

--rust, -r
テーブル/構造体に Rust ファイルを生成する。

--php
テーブル/構造体用の PHP ファイルを生成する。

--kotlin
テーブル/構造体にKotlinクラスを生成する。

--jsonschema
Json スキーマを生成する。

--swift
テーブル/構造体用の Swift ファイルを生成する。

--nim
テーブル/構造体のNimファイルを生成する。

-o PATH
生成されるファイルの先頭に PATH を付ける。

-I PATH
指定したパスでインクルードを検索する。

-M
生成されるファイルに make(1) のルールを表示する。


お願い致します