OutOfMemoryException interessante com StringBuilder
Eu tenho a necessidade de construir continuamente grandes strings em um loop e salvá-los no banco de dados que atualmente ocasionalmente produz umOutOfMemoryException
.
O que basicamente está acontecendo aqui é criar uma string usandoXmlWriter
comStringBuilder
com base em alguns dados. Em seguida, chamo um método de uma biblioteca externa que converte essa string xml em alguma outra string. Depois disso, a string convertida é salva no banco de dados. Tudo isso é feito repetidamente em um loop cerca de 100 vezes para dados diferentes.
As seqüências de caracteres por si só não são muito grandes (abaixo de 500 kByte cada) e a memória de processo não está aumentando durante esse loop. Mas ainda assim, ocasionalmente receboOutOfMemeoryExcpetion
dentroStringBuilder.Append
. Curiosamente, esta exceção não resulta em falha. Eu posso pegar essa exceção e continuar o loop.
O que está acontecendo aqui? Por que eu teria umaOutOfMemoryException
allthough ainda há memória livre suficiente disponível no sistema? Isso é algum problema de heap do GC?
Dado que não posso contornar a conversão de todas essas seqüências, o que eu poderia fazer para que isso funcione de forma confiável? Devo forçar uma coleção de GC? Deve colocar umThread.Sleep
no loop? Devo parar de usarStringBuilder
? Deve simplesmente tentar quando confrontado com umOutOfMemoryException
?