Как я могу запустить множество RegExes (для поиска совпадений) в больших строках, не вызывая фрагментацию LOH?
Это .NET Framework 4.0, поэтому я использую StringBuilder
, поэтому его нет в LOH, однако, как только мне нужно запустить на нем RegEx, я должен вызвать StringBuilder.ToString ()
, что означает, что он будет в LOH.
Есть ли решение этой проблемы? Практически невозможно иметь долго работающее приложение, которое имеет дело с большими строками и подобными регулярными выражениями.
Идея для решения этой проблемы:
Размышляя над этой проблемой, я думаю, что нашел грязное решение.
В данный момент у меня есть только 5 строк, и эти 5 строк (больше 85 КБ) будут переданы в RegEx.Match
.
Поскольку фрагментация происходит из-за того, что новые объекты не помещаются в пустые места в LOH, это должно решить проблему:
PadRight
все строки на максимум. допустимый размер, допустим, 1024 КБ (мне может понадобиться сделать это с помощью StringBuider
) Я полагаю, что самая большая проблема с этим дизайном - это то, что происходит, если другие большие объекты выделяют это место в LOH, что заставляет приложение выделять много строк по 1024 КБ, возможно, с еще большей фрагментацией. fixed
оператор может помочь, однако как я могу отправить фиксированную строку в RegEx без фактического создания новой строки, которая не находится в фиксированном адресе памяти?
Есть идеи по поводу этой теории? (К сожалению, я не могу легко воспроизвести проблему, я обычно пытаюсь использовать профилировщик памяти, чтобы наблюдать за изменениями и не уверен, какой изолированный тестовый пример я могу написать для этого)