Это возможно, и я не уверен, что StringBuilder каким-то образом позволяет Regex работать более эффективно, но IMO - это не то, на что вам следует полагаться. Если у вас не хватает памяти, это может указывать на большую проблему дизайна, которую следует решить.
я есть журнал исключений из одного из выпусков производственного кода.
System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
at System.Text.RegularExpressions.Match..ctor(Regex regex, Int32 capcount, String text, Int32 begpos, Int32 len, Int32 startpos)
at System.Text.RegularExpressions.RegexRunner.InitMatch()
at System.Text.RegularExpressions.RegexRunner.Scan(Regex regex, String text, Int32 textbeg, Int32 textend, Int32 textstart, Int32 prevlen, Boolean quick)
at System.Text.RegularExpressions.Regex.Run(Boolean quick, Int32 prevlen, String input, Int32 beginning, Int32 length, Int32 startat)
at System.Text.RegularExpressions.MatchCollection.GetMatch(Int32 i)
at System.Text.RegularExpressions.MatchEnumerator.MoveNext()
Данные, которые он пытается обработать, составляли около 800 КБ.
В моих локальных тестах это работает отлично. Вы когда-нибудь видели подобное поведение, в чем может быть причина?
Должен ли я разделить текст перед его обработкой, но, очевидно, в этом случае регулярное выражение может не совпадать, поскольку исходный файл отделен от случайного места.
Мои регулярные выражения:
РЕДАКТИРОВАТЬ 2:
Я думаю, что именно этот RegEx вызывает проблему, когда я тестирую его в изолированной среде, он мгновенно пожирает память.
((?:( |\.\.|\.|""|'|=)[\/|\?](?:[\w#!:\.\?\+=&@!РЕДАКТИРОВАТЬ
Я был не прав с моим местным тестом. Я загружал большую строку, затем добавлял к ней материал, который вызывал головокружение .NET Framework, а затем выдавал исключение OOM во время RegEx, а не во время строковых операций (или случайным образом, так что игнорируйте предыдущий материал, который я сказал).
Это приложение .NET Framework 2.0.
~*,;\/\(\)\[\]\-]|%[0-9a-f]{2})*)( |\.|\.\.|""|'| ))?
РЕДАКТИРОВАТЬ
Я был не прав с моим местным тестом. Я загружал большую строку, затем добавлял к ней материал, который вызывал головокружение .NET Framework, а затем выдавал исключение OOM во время RegEx, а не во время строковых операций (или случайным образом, так что игнорируйте предыдущий материал, который я сказал).
Это приложение .NET Framework 2.0.