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