オブジェクトを非常に迅速にメモリに読み込む必要があるソリューションがありますが、ディスク io の時間を節約するために、バイナリ ストリームが圧縮されてメモリにキャッシュされる場合があります。
私はさまざまなソリューションをいじくり回しましたが、明らかに XmlTextWriter と XmlTextReader はあまり良くなく、組み込みのバイナリシリアル化もそうではありませんでした。Protobuf-net は優れていますが、それでも少し遅すぎます。ここにいくつかの統計があります:
ファイル サイズ XML: 217 kb
ファイルサイズ バイナリ: 87 kb
圧縮バイナリ: 26 KB
圧縮された XML: 26 KB
XML でデシリアライズ (XmlTextReader) : 8.4 秒
バイナリでデシリアライズ (Protobuf-net): 6.2 秒
Binary wo string.interning (Protobuf-net) でデシリアライズ: 5.2 秒
Binary でデシリアライズメモリから: 5.9 Sek
バイナリ ファイルをメモリに解凍する時間: 1.8 秒
Xml でシリアライズ (XmlTextWriter) : 11 秒
バイナリ (Protobuf) でシリアル化: 4 秒
バイナリ長のプレフィックス (Protobuf-net) でシリアル化: 3.8 秒
逆シリアル化の主な原因は、IO ではなく実際のバイト変換であるように思われます (間違っている場合は訂正してください)。その場合は、新しい Parallel 拡張機能を使用する候補になるはずです。
私はバイナリIOに関しては少し初心者なので、解決に時間を割く前にいくつかの意見をいただければ幸いです:)
簡単にするために、オプションのフィールドを持たないオブジェクトのリストを逆シリアル化するとします。私の最初のアイデアは、それぞれに長さの接頭辞を付けて保存することでした。それぞれの byte[] を byte[] のリストに読み取り、PLINQ を使用して byte[] -> オブジェクトの逆シリアル化を実行します。
ただし、その方法では、バイト [] をシングルスレッドで読み取る必要があるため、代わりにバイナリ ストリーム全体をメモリに読み込むことができます (ところで、バイナリ ファイルの大きさはどれくらいですか?)。多くのオブジェクトがあり、それぞれの長さとオフセットがあります。次に、ArraySegments などを作成して、チャンクも並列に実行できるようにする必要があります。
それで、あなたはどう思いますか、それは実現可能ですか?