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