Как решить фрагментацию stringBuilder? - PullRequest
4 голосов
/ 14 мая 2011

Я получаю приятное исключение SystemOutOfMemory в моих StringBuilders.Это не связано с отсутствием оперативной памяти, поэтому я считаю, что это фрагментация памяти.

У меня ~ 200 объектов StringBuiler.Все они регулярно используются (с strBldr.clear ()).Это, кажется, заставляет мою систему фрагментировать память довольно плохо.Как я могу решить это?

Спасибо:)

РЕДАКТИРОВАТЬ:

Вот некоторые данные:

Максимальный записанный размер ввода и stringBuilder: 4 146 698.

Сдавить заново инициализированные stringBuilders / сек:> 120 (возможно >> 120)

Длина ввода при первой ошибке: 16 972(строка)

Длина StringBuilder @ первая ошибка: 16

Количество попыток создания нового stringBuilder при первой ошибке: ~ 32500

Общее использование оперативной памяти @ первая ошибка 637448K

Ответы [ 3 ]

4 голосов
/ 14 мая 2011

Согласен, скорее всего у вас заканчивается не память, а фрагментация.

Вам необходимо ознакомиться с фрагментацией и кучей больших объектов (LOH).

Вы не предоставили никаких подробностей, поэтому я могу дать только очень общий совет:

  • попытайтесь оценить, насколько большими будут ваши строки, и используйте параметр Capacity для нового SB
  • round up (действительно), чтобы эти числа были кратны некоторому числу.Это способствует повторному использованию.
  • используйте Clear () только в том случае, если вы ожидаете, что новое содержимое будет почти такого же размера, как и старое, и это то, что вас убивает.

Редактировать

Максимальный записанный размер ввода и строкиBuilder: 4 146 698.

  • Убедитесь, что нетпромежуточные звенья, которые нужно увеличить, тогда
  • Создайте все StringBuilders, например sb1 = new StringBuilder(4200000);
  • Не пытайтесь повторно использовать их (слишком много / совсем)
  • Донне держите их слишком долго
4 голосов
/ 14 мая 2011

Вы не должны повторно использовать StringBuilder как этот, просто создайте новый по мере необходимости.

Когда вы вызываете Clear на StringBuilder, он не освободит всю используемую память,это только сбросит используемый размер к нулю.Он по-прежнему будет иметь такой же большой буфер, а повторное использование StringBuilder означает только то, что буфер будет таким же большим, каким он когда-либо был необходим, и никогда не будет сокращаться.объекты для повторного использования означают, что они отслеживают сборку мусора и переходят к куче следующего поколения.Они собираются реже, поэтому они более чувствительны к фрагментации памяти.

0 голосов
/ 15 мая 2011

В итоге я перешел на x64 .Это решило мои проблемы.

Возможно, я случайно назначил все пространство памяти x86, хотя я не использовал все это.Переход на x64, безусловно, решит эту проблему.

...