私のアプリケーションは、最終的に断片化の問題を引き起こす大きなオブジェクト ヒープに入るテキスト ファイルから大量のデータを読み取ります。これらを LOH に到達させないようにするための代替設計アプローチはありますか? StringBuilder については知っていますが、テキスト ファイルから読み取ると、内部的に大きな文字列が LOH に作成されるようです。
1 に答える
1
への呼び出しを変更したくないReadAllLines
場合、文字列が十分に大きい場合に LOH への割り当てを回避する方法はありません (.Net github リポジトリのクローンを作成し、割り当て戦略を変更し、再コンパイルする以外にはありません)。他の解決策では、ファイルから小さな文字列を読み取るか、ファイルをバイトとして独自のバッファーに読み取り、そこでバイトの割り当てと配置を独自に管理します。おそらく、独自の文字列クラスを作成することで拡張されます (System.String常に独自のバッファーにコピーします)。
ただし、.Net >=4.5.1: LOH 圧縮を選択できるようになりました。これを手動で実行するには、次を実行します。
GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect();
于 2015-09-23T00:35:28.213 に答える