protobuf メッセージの保存にはバイナリまたはテキスト ファイルを使用する必要がありますか?
-
13-09-2019 - |
質問
Google protobuf を使用して、シリアル化されたメッセージ データをファイルに保存しています。各ファイルには複数のメッセージが含まれています。コードには C++ バージョンと Python バージョンの両方があるため、両方の言語で使用できる protobuf 関数を使用する必要があります。SerializeToArray と SerializeAsString を使用して実験しましたが、次のような残念な状況があるようです。
SerializeToArray:1 つの回答で示唆されているように、これを使用する最良の方法は、各メッセージの先頭にデータ サイズを付けることです。これは C++ ではうまく機能しますが、Python ではこれは可能ではないようです。私は間違っていますか?
SerializeAsString:これにより、対応するバイナリ文字列と同等のシリアル化された文字列が生成されます。これはファイルに保存できますが、シリアル化結果の文字の 1 つが の場合はどうなりますか。行末やメッセージの末尾はどのように見つければよいのでしょうか。 ?
アップデート:
少し言い換えさせてください。私の理解では、C++ でバイナリ データを書くことはできません。その場合、Python アプリケーションは文字列のシリアル化されたメッセージしか解析できないため、データを読み取ることができません。代わりに使用する必要がありますか SerializeAsString
C++ と Python の両方で?「はい」の場合、そのようなデータはバイナリ ファイルではなくテキスト ファイルに保存するのがベスト プラクティスですか?私の直感は二者択一ですが、ご覧のとおり、これは選択肢ではないようです。
解決
この方法でメッセージを連結するためのベストプラクティスは、その大きさと、各メッセージを付加することです。あなたのサイズ(32ビットintまたは何かを試してみてください)で読むことの方法は、その後、バッファにそのバイト数を読んで、それをデシリアライズ。その後、次の大きさ、などなどを読みます。
同じ書き込みに行くには、最初のメッセージのサイズを書き出し、その後、メッセージ自体ます。
ストリーミング複数のメッセージがより多くのためにいるProtobufのドキュメントにを参照してください。情報ます。
他のヒント
私たちは、偉大な成功をbase64メッセージをコード化する、とのメッセージを分離するために、簡単な\ nを使用してきました。これはofcoirseはご利用に大きく依存します - 私たちは、「ログ」ファイルにメッセージを格納する必要があります。それは当然のオーバーヘッドのエンコード/デコード、これをを持っている - しかし、これも、リモートで私たちのために問題がなかった。
。の行区切りのテキストは、これまでの保守やデバッグのための貴重あったように、これらのメッセージを維持することの利点。ファイルに記述されているどのように多くのメッセージを見つけ出しますか? wc -l
。 head ... | tail
- N番目のメッセージを検索します。あなたは2つのVPNを介してアクセスする必要があり、リモート・システム上の記録とCitrixソリューションと間違っているかを把握?メッセージを貼り付け、プログラマにそれを郵送コピーします。
いるProtobufので読み書きはバイナリではなくテキストとして行われる必要があり、バイナリ形式です。 あなたはバイナリ形式を使用しない場合、あなたはいるProtobuf以外のものを使用することを検討すべきである(例えばXML、JSON、CSVなどのテキストデータ形式の多くは、あります)。テキストだけの抽象化を使用するだけでは十分ではありません。