интересное исключение OutOfMemory с StringBuilder
Мне нужно постоянно строить большие строки в цикле и сохранять их в базе данных, которая в настоящее время иногда даетOutOfMemoryException
.
Что в основном происходит здесь, я создаю строку, используяXmlWriter
с участиемStringBuilder
на основании некоторых данных. Затем я вызываю метод из внешней библиотеки, который преобразует эту строку XML в другую строку. После этого преобразованная строка сохраняется в базе данных. Все это повторяется в цикле около 100 раз для разных данных.
Строки сами по себе не слишком велики (менее 500 Кбайт каждая), и память процесса не увеличивается во время этого цикла. Но все же, иногда я получаюOutOfMemeoryExcpetion
вStringBuilder.Append
, Интересно, что это исключение не приводит к падению. Я могу поймать это исключение и продолжить цикл.
Что здесь происходит? Зачем мне получатьOutOfMemoryException
хотя в системе все еще достаточно свободной памяти? Это какая-то проблема с кучей GC?
Учитывая, что я не могу обойти преобразование всех этих строк, что я мог сделать, чтобы сделать это надежно? Должен ли я форсировать сбор GC? Следует положитьThread.Sleep
в петлю? Должен ли я прекратить использованиеStringBuilder
? Следует просто повторить попытку при столкновении сOutOfMemoryException
?