Свойство StringBuilder's Capacity - это количество символов, которое нужно выделить в качестве строкового буфера.С UTF-8 символ может иметь длину до 4 байтов.Даже при 2 байтах емкость Int32.MaxValue - 1
значительно превышает емкость 32-битной системы, а весит 4 ГБ только для 2-байтовых символов (UTF-8 / ASCII).Кроме того, StringBuilder по умолчанию Capacity уже установлен на Int32.MaxValue, если вы посмотрите на документацию .
Если вы зацикливаетесь для заполнения StringBuilder, возможно, вы заполняете его быстрее, чем может .NETочистите выделенную память с помощью сборки мусора, поэтому она может останавливаться на длине 2048 символов.Кроме того, внутренне ему необходим непрерывный блок памяти, с которым он также может столкнуться.
Ваш вопрос, однако, касается свойства Capacity, и вы никогда не сможете выделить столькоемкость в 32-битной системе.Я нашел интересное обсуждение по MSDN, касающееся этой конкретной проблемы, и в ходе тестирования было установлено, что фактическая емкость намного ниже, поскольку емкость Int32.MaxValue переводится в 4 ГБ памяти, которая необходима, когда все символы имеют 2-байт.
Можно ли вместо этого использовать файл с отображением в памяти ?StringBuilder не предназначен для этого, и вам нужно пересмотреть свой дизайн.