このように構造化された(簡略化された).protoがあるとしましょう
Message DataItem {
required string name = 1;
required int32 value = 2;
}
Message DataItemStream {
repeated DataItem items = 1;
}
サーバーは を作成しDataItemStream
、ディスクに書き込みます。このファイルをロードすると、問題なくすべてが満足しています。
これは私たちにとって非常にうまく機能しましたが、クライアントベースが拡大し、ファイルのストリームを生成するソフトウェアの使用も拡大しました.
問題が発生するのは、繰り返しitems
フィールドに何万ものアイテムを含めることができるが、それらのサブセットのみに関心がある場合です。私たちは少し掘り下げましたが、Google のストリーミングアドバイス(保存されたsにサイズ プレフィックスをDataItem
追加し、各メッセージを個別に解析するか、または CodedInputStream
/CodedOutputStream
またはバイナリ ワイヤ フォーマット (base64) をエンコードし、改行で区切ると、関心のあるサブセットだけを非常に簡単に取得できます.
これらのいずれも機能しますが、ファイルの保存方法を変更するには、本番コードにいくつかの変更が必要です (サーバーベースのコードは長い間変更されておらず、管理者によって事実上変更できないと見なされています (彼らの考えでは、ドン壊れていない場合は修正しないでください)...)
メッセージを異なる方法でストリーミングするサーバー用のモジュールを既に再作成しましたが、変更をプッシュすることについてメンテナーから非難を受けています。開発サイクルを完全に制御できるため、必要に応じてコードを変更する方が (政治的に) はるかに簡単です。
この元のメッセージ ストリームを引き続き使用しながら、読み込むメッセージのサブセットのみを賢く選択する方法はありますか? (それが重要な場合、どの言語で作業する必要があるかは本当に気にしません.C ++、Python、Java、および.NETの経験があります(経験の順序で))