2017-06-06 4 views
0

科学アプリケーションからデータを保存するにはバイナリ形式を設計する必要があります。このデータは、他のアプリケーションでは容易に読み取ることができないバイナリ形式でエンコードする必要があります(クライアントの一部の要件です)。結果として、独自のバイナリ形式、そのエンコーダとそのデコーダを構築することにしました。Protobufバイナリ形式のデザイン:パフォーマンスとvarint

protobufを含む多くのバイナリ形式からインスピレーションを得ています。 protobufが埋め込まれたメッセージの長さをエンコードする方法です。 https://developers.google.com/protocol-buffers/docs/encodingによれば、埋め込まれたメッセージのサイズは、最初はvarintとしてエンコードされています。 しかし、埋め込まれたメッセージをエンコードする前に、そのサイズはまだわかりません(varintとしてエンコードされた多数の整数を含む埋め込みメッセージの例を考えてください)。その結果、メッセージをディスクに書き込む前にメッセージを完全に符号化して、そのサイズを知る必要があります。 このメッセージは膨大であると想像してください。結果として、効率的な方法でそれを符号化することは非常に困難である。埋め込まれたメッセージが書き込まれたら、このサイズを完全なintとしてエンコードしてファイルのこの部分に戻すことができますが、varintのniceプロパティが緩和されています.32ビットまたは64ビット整数。したがって、varintを使用してGoogleの実装に戻る:

実装方法がありませんか?この方式は大きなメッセージでは効率が悪いですか?

+0

科学データと大きなファイルについては、HDF5もご覧ください。大量のデータがある場合、そのパフォーマンスはしばしばprotobufよりも優れています。 – jpa

答えて

0

はい、これを行う正しい方法は、最初にメッセージをバッファの後ろに書いてから、サイズを前に付けることです。適切なバッファ管理によって、メッセージを逆に書くことができます。

しかし、なぜprotobufを使うことができるときに自分のメッセージフォーマットを書いていますか? Protobufを直接使用し、ファイル形式を暗号化する方が良いでしょう。それはあなたが使いやすく、他のアプリケーションが読むのが難しいでしょう。

+0

私はprotobufを使いたくない理由はたくさんあります。主なものは、私がBSONとMessagePackが動作する方法、保存されたファイルにキーとタイプを使って何かを動的にしたいということです。別の理由は、uint16(16ビットの深さのグレースケール画像用)の配列を格納するということです。 protobufが常に2バイトを取るuint16型を持たないという事実は役に立ちません。 – InsideLoop

+0

それでは、なぜProtobufに関する質問を投稿したのですか?あなたが非常に異なる電線形式のものを望むとき、それは見えないように見えます。 –

+0

私はさまざまなファイル形式からベストアイデアを盗もうと思っています。それが私がそれらの背後にある論理的根拠、その利点、その欠点を理解したい理由です。 – InsideLoop

関連する問題