6

私は、500 万を超える項目を持つリストと辞書を持つシステムを使用しています。各項目は通常、最大 90 のプリミティブ プロパティを持つフラットな dto です。コレクションは、回復力とサブシーケンス処理のために protobuf-net を使用してディスクに永続化されます。

当然のことながら、処理中とシリアル化中に LOH に達しています。

ConcurrentBag などを使用して処理中に LOH を回避できますが、シリアライズ時に問題が発生します。

現在、コレクション内のアイテムは 1000 個のグループにバッチ処理され、並行してメモリ ストリームにシリアル化されます。各バイト配列は同時キューに配置され、後でファイル ストリームに書き込まれます。

これが何をしようとしているのかは理解できますが、複雑すぎるようです。LOH を使用せずに巨大なコレクションを処理する protobuf 自体の中に何かがあるはずです。

見落としている設定がいくつかあるという、男子生徒の間違いを犯したことを願っています。それ以外の場合は、カスタム バイナリ リーダー/ライターの作成を検討しています。

私たちは 4.0 を使用しており、すぐに 4.5 に移行することを検討していますが、GC の改善にもかかわらず、この問題を解決できないことを認識しています。

どんな助けでも感謝します。

4

1 に答える 1

0

データをディスクに書き込みます。メモリ ストリームは使用しません。

StreamReader を使用して読み取るので、処理を行うためにすべてのデータを同時にロードする必要がある場合、そのデータから大量のデータをメモリに保持する必要はありません。その後、それらを一時テーブルにストーリー化して SQL サーバーで実行します。

メモリは大きなデータを保存する場所ではありません。

于 2013-09-30T20:26:31.003 に答える