Генератор исходных выражений регулярных выражений с большим регулярным выражением вызывает исключение OutOfMemoryException при сборке dotnet
У меня есть большое регулярное выражение в виде списка слов, разделенных|
. Вся длина регулярного выражения составляет 1 миллион символов.
[RegexGenerator(@"KnownItem1|KnownItem2|KnownItem3")]
private static partial Regex NamedEntities();
Сборка с помощью сборки dotnet приводит к этой ошибке
CSC : warning CS8785: Generator 'RegexGenerator' failed to generate source. It will not contribute to the output and co
mpilation errors may occur as a result. Exception was of type 'OutOfMemoryException' with message 'Exception of type 'S
ystem.OutOfMemoryException' was thrown.'
Процесс dotnet.exe занимал 5 ГБ ОЗУ при возникновении вышеуказанной ошибки. Как я могу добиться успеха сборки?
Я искал, как увеличить ОЗУ, используемое сборкой dotnet, как уменьшить использование ОЗУ, не выдавая символы отладки, но не нашел решения. Это также другой случай по сравнению с Regex OOM во время выполнения, о котором много раз спрашивали в StackOverflow — это ошибка времени компиляции с новым генератором исходного кода Regex. Это регулярное выражение работает в интерпретируемом режиме во время выполнения.
1 ответ
В настоящее время регулярное выражение .NET не оптимизировано для этого варианта использования. Идет обсуждение оптимизации для этого случая с Aho-Corasick .
Обходной путь теперь состоит в том, чтобы использовать Aho-Corasick и устранять перекрывающиеся совпадения вручную.
Например
hellover
при сопоставлении с регулярным выражениемhello|lover
Матчи .
Однако Ахо-Корасик соответствует обоимhello
и, таким образом, вам придется отслеживать индексы и длины возвращаемых совпадений и устранятьlover
чтобы имитировать поведение регулярных выражений.