私は以前にProtobuf-Netに関して関連しているがまだ異なる質問を投稿したので、ここに行きます:
誰か(特にマーク)が次のうちどれが最も速い可能性が高いかについてコメントできるかどうか疑問に思います:
(a)現在、シリアル化された組み込みデータ型をバイナリファイルに保存しています。具体的には、long(8バイト)と2つのfloat(2x 4バイト)です。これらの3つは、後で逆シリアル化された状態の1つのオブジェクトを構成します。longタイプは、ルックアップの目的でDateTimeTicksを表します。バイナリ検索を使用して、データリクエストの開始位置と終了位置を見つけます。次に、メソッドは、各チャンクが上記のトリプレット(1つの長さ、1つのフロート、1つのフロート)の多くのパケットで構成され、各トリプレットが常に16バイトの長さであることを認識して、データを1つのチャンク(開始位置から終了位置まで)にダウンロードします。したがって、取得されるトリプルの数は常に(endLocation --startLocation)/16です。次に、取得したバイト配列を反復処理し、(BitConverterを使用して)各組み込み型を逆シリアル化し、それぞれがトリプレットで構成される新しいオブジェクトをインスタンス化し、さらに処理するためにオブジェクトをリストに格納します。
(b)次のことを行う方が速いでしょうか?ルックアップの目的でインデックスとして機能する別のファイルを作成します(またはヘッダーを実装します)。次に、組み込み型の個々のバイナリバージョンを格納せず、代わりにProtbuf-netを使用して、上記のオブジェクトのリスト(=オブジェクトのソースとしてのint、float、floatのトリプレット)をシリアル化します。各リストには、正確かつ常に1日分のデータが含まれます(longはDateTimeTickを表すことに注意してください)。明らかに、各リストのサイズは異なります。したがって、各データ読み取り要求は丸1日の倍数しか要求しないため、インデックス検索の目的で別のファイルまたはヘッダーを生成するという私の考えです。ある日のシリアル化されたリストを取得したい場合は、インデックスを検索し、バイト配列を読み取り、Protobuf-Netを使用して逆シリアル化し、オブジェクトのリストを既に作成します。
データの大きさについてより良いアイデアを与えるために、各バイナリファイルは約3 GBの大きさであるため、何百万ものシリアル化されたオブジェクトが含まれています。各ファイルには、約1000日分のデータが含まれています。各データリクエストは、1日分のデータをリクエストできます。
あなたの意見では、生の処理時間の方が速いと思いますか?(b)を実装するために多くのコードを書く前に、いくつかの入力を収集したかったのですが、現在(a)で、マシン上で1秒あたり約150万個のオブジェクトを処理できます(プロセス=データ要求から返された逆シリアル化されたリストまで)オブジェクト)。
要約:バイナリデータがI / Oの読み取りを高速化し、アプローチ(a)または(b)を使用して逆シリアル化できるかどうかを尋ねています。