2017-11-30 11 views
3

私はprotobufを初めて使いました。私は複雑なグラフのような構造をシリアル化し、C++とPythonクライアントの間で共有する必要があります。ので 私がいるProtobufを適用しようとしている:それは言語に依存しないで大きなデータ構造でprotobufが悪いのはなぜですか?

  • 、発電機は両方ともそれがバイナリである
  • C++とPythonのために持っています。

    プロトコルバッファが大きなメッセージを処理するように設計されていません。私のデータ構造は

非常に大きい。しかしいるProtobufのユーザーガイドが言うので、私は、テキスト形式を買う余裕はありません。 一般的な経験則として、それぞれ メガバイトを超えるメッセージを扱う場合は、別の戦略を考慮する必要があります。

https://developers.google.com/protocol-buffers/docs/techniques#large-data

私は道1メガビット以上の大きさで1 GBまで時々あるグラフのような構造を持っています。

大きなデータセットをシリアル化するには、なぜprotobufが悪いのですか?代わりに私は何を使うべきですか?

答えて

3

これは一般的なガイダンスであるため、すべての場合に適用されるわけではありません。たとえば、OpenStreetMapプロジェクトでは、マップにプロトコルバッファベースのファイル形式が使用され、ファイルのサイズは10〜100 GBになることがよくあります。もう1つの例は、Google独自のTensorFlowで、これはprotobufを使用し、保存するグラフのサイズは最大1 GBです。

ただし、OpenStreetMapではファイル全体が単一のメッセージとして表示されません。代わりに、数千の個別のメッセージで構成され、それぞれがマップの一部をエンコードします。同様のアプローチを適用することができ、その結果、各メッセージは、例えば、 1つのノード。

大きなファイルのprotobufの主な問題は、ランダムアクセスをサポートしていないことです。特定のアイテムにのみアクセスしたい場合でも、ファイル全体を読む必要があります。とにかくアプリケーションがファイル全体をメモリに読み込む場合、これは問題ではありません。これはTensorFlowの機能であり、すべてを単一のメッセージに保存するように見えます。

多くの言語で互換性のあるランダムアクセス形式が必要な場合は、HDF5またはsqliteをお勧めします。

+0

ファイルからのランダムアクセスは私にとっては問題ではありません。メモリに1GBをプリロードするのは大丈夫です。 – random

3

1MBよりもはるかに大きいプロトコルバッファを使用することは問題ありません。私たちはいつもGoogleでそれをやっており、引用している勧告についても気づいていませんでした。

主な問題は、プロトコルバッファ全体を一度にメモリにデシリアライズする必要があるため、データが小項目に分割されているかどうかを考える価値はあるので、データを一度にメモリに保存します。

あなたがそれを分解することができない場合は、心配はありません。大規模なプロトコルバッファを使用してください。

関連する問題