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