ループ内で大きな文字列を継続的に構築し、それらをデータベースに保存する必要がありますが、現在、OutOfMemoryException
.
ここで基本的に行われているのは、いくつかのデータに基づいてXmlWriter
withを使用して文字列を作成することです。StringBuilder
次に、この xml 文字列を別の文字列に変換する外部ライブラリのメソッドを呼び出します。その後、変換された文字列がデータベースに保存されます。このすべてが、さまざまなデータに対して約 100 回のループで繰り返し実行されます。
文字列自体はそれほど大きくなく (それぞれ 500kByte 未満)、プロセス メモリはこのループ中に増加しません。それでも、時々私はOutOfMemeoryExcpetion
以内にStringBuilder.Append
. 興味深いことに、この例外によってクラッシュが発生することはありません。その例外をキャッチして、ループを続行できます。
ここで何が起こっているのですか?OutOfMemoryException
システムに使用可能な空きメモリがまだ十分にあるのに、なぜエラーが発生するのですか? これはGCヒープの問題ですか?
これらすべての文字列の変換を回避できない場合、これを確実に機能させるにはどうすればよいでしょうか? GC コレクションを強制する必要がありますか? Thread.Sleep
aをループに入れる必要がありますか? 使用をやめるべきStringBuilder
ですか?OutOfMemoryException
?に直面したときは、単純に再試行する必要があります。