3

私はC#アプリケーションに取り組んでいますが、多くのオブジェクトがラージオブジェクトヒープでメモリ割り当てを取得しているため、このアプリケーションはメモリ不足に直面しています。

私のC#アプリケーションは(文字列オブジェクトとして)多くの大きなファイルで動作する必要があるため、この文字列型オブジェクトのメモリは、大きなオブジェクトヒープから何度も割り当てられます(したがって、LOHの断片化につながります)。

文字列は不変オブジェクトであるため、LOHの新しいメモリは常にこのオブジェクトに割り当てられます。私の質問は、大きなオブジェクトヒープにメモリを事前に割り当てて、常に同じメモリを文字列オブジェクトに割り当てる方法はありますか。

詳細は次のとおりです。前述したように、私はこれらの大きなファイルを処理しています。処理を行うには、文字列に変換する必要があります。stringBuilderを使用している場合でも、Stringに変換するとすぐに、このための別のメモリがLOHに割り当てられるため、あまり役に立ちません。

したがって、メモリに100 KBを割り当てることを期待していました。新しいファイルを読み取って文字列に変換するたびに、これらの100KBが割り当てられます。

4

3 に答える 3

3

StringBuilderオブジェクトは可変文字列であり、操作するための多くのメソッドを提供するため、文字列を操作するにはオブジェクトを 使用する必要があります。

あなたはすべての文字列が何度も何度も作成されると言っています。何らかの理由で文字列を使用する必要がある場合は、文字列だけを使用します。文字列はIntern一度保存され、メモリヒープに再度追加されることはありません。

于 2011-06-11T13:10:45.560 に答える
1

メモリマップトファイルの使用を検討しましたか? http://msdn.microsoft.com/en-us/library/dd997372.aspx

文字列をどうするかわかりませんが、ストリームを使用しない理由はありますか?

于 2011-06-11T13:11:11.543 に答える
1

文字列でどのようなアクションを実行したいかは不明です。最善の方法は、最終結果の見積もりです。悲観的な (大規模な) 見積もりを使用し、マージンを追加することもできます。

次に、容量パラメーターを使用して StringBuilder を作成します。

var buffer = new StringBuilder(LargestExpectedSize);

これは本質的に、LOH での事前割り当てです。StringBuilders またはList<>s の(自動) 拡張を避ける

于 2011-06-11T13:58:05.423 に答える