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