OutOfMemoryException no Regex Corresponde ao processar arquivos grandes
Eu tenho um log de exceção de um dos lançamentos de código de produçã
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()
Os dados que ele tenta processar eram de cerca de 800 K
Nos meus testes locais, ele funciona perfeitamente bem. Você já viu um comportamento semelhante, qual pode ser a causa?
Devo dividir o texto antes de processá-lo, mas obviamente nesse caso a regex pode não corresponder porque o arquivo original foi dividido em um local aleatóri
My Regexes:
EDIT 2:
Acho que esse RegEx específico está causando o problema, quando o testo em um ambiente isolado, ele está consumindo a memória instantaneament
((?:( |\.\.|\.|""|'|=)[\/|\?](?:[\w#!:\.\?\+=&@!EDITA
Eu estava errado com meu teste local. Eu estava carregando uma string grande e depois anexando itens a ela, o que deixa o .NET Framework tonto e, em seguida, gera uma exceção de OOM durante o RegEx, em vez de durante operações de string (ou aleatoriamente, então ignore as coisas anteriores que eu disse).
Este é um aplicativo .NET Framework 2.
~*,;\/\(\)\[\]\-]|%[0-9a-f]{2})*)( |\.|\.\.|""|'| ))?
EDITA
Eu estava errado com meu teste local. Eu estava carregando uma string grande e depois anexando itens a ela, o que deixa o .NET Framework tonto e, em seguida, gera uma exceção de OOM durante o RegEx, em vez de durante operações de string (ou aleatoriamente, então ignore as coisas anteriores que eu disse).
Este é um aplicativo .NET Framework 2.