RegEx, StringBuilder и фрагментация кучи больших объектов

Как я могу запустить множество RegExes (для поиска совпадений) в больших строках, не вызывая фрагментацию LOH?

​​Это .NET Framework 4.0, поэтому я использую StringBuilder , поэтому его нет в LOH, однако, как только мне нужно запустить на нем RegEx, я должен вызвать StringBuilder.ToString () , что означает, что он будет в LOH.

Есть ли решение этой проблемы? Практически невозможно иметь долго работающее приложение, которое имеет дело с большими строками и подобными регулярными выражениями.

Идея для решения этой проблемы:

Размышляя над этой проблемой, я думаю, что нашел грязное решение.

В данный момент у меня есть только 5 строк, и эти 5 строк (больше 85 КБ) будут переданы в RegEx.Match .

Поскольку фрагментация происходит из-за того, что новые объекты не помещаются в пустые места в LOH, это должно решить проблему:

  1. PadRight все строки на максимум. допустимый размер, допустим, 1024 КБ (мне может понадобиться сделать это с помощью StringBuider )
  2. Таким образом, все новые строки будут соответствовать уже освобожденной памяти, поскольку предыдущая строка уже выходит за рамки
  3. Не будет никакой фрагментации, потому что размер объекта всегда один и тот же, поэтому я выделяю только 1024 * 5 в данный момент времени, и это пространство в LOH будет совместно использоваться этими строками.

Я полагаю, что самая большая проблема с этим дизайном - это то, что происходит, если другие большие объекты выделяют это место в LOH, что заставляет приложение выделять много строк по 1024 КБ, возможно, с еще большей фрагментацией. fixed оператор может помочь, однако как я могу отправить фиксированную строку в RegEx без фактического создания новой строки, которая не находится в фиксированном адресе памяти?

Есть идеи по поводу этой теории? (К сожалению, я не могу легко воспроизвести проблему, я обычно пытаюсь использовать профилировщик памяти, чтобы наблюдать за изменениями и не уверен, какой изолированный тестовый пример я могу написать для этого)

12
задан dr. evil 5 November 2011 в 17:08
поделиться