Tengo una situación donde mis expresiones regulares se compilan muy lentamente en Windows Server 2008. Escribí una pequeña aplicación de consola para resaltar este problema. La aplicación genera su propia entrada y crea una Regex a partir de palabras en un archivo XML. Creé una versión de lanzamiento de esta aplicación y la ejecuté tanto en mi computadora portátil personal (que ejecuta XP) como en el servidor de Windows 2008. La expresión regular tomó 0,21 segundos para compilarse en mi computadora portátil, pero 23 segundos para compilar en el servidor.Regex lento en Windows Server 2008
¿Alguna idea de lo que podría estar causando esto? El problema es solo en el primer uso de Regex (cuando se compila por primera vez, luego está bien)
También encontré otro problema: al usar \s+
en la expresión regular en el mismo servidor de Windows 2008, los globos de memoria (usa 4GB +) y la compilación de Regex nunca termina.
¿Existe algún problema con Regex y 64 bit de .net? ¿Hay una solución/parche disponible para esto? Realmente no puedo encontrar ninguna información en la red, pero he encontrado algunos artículos sobre estos mismos problemas en Framework 2.0. ¿Seguro que ya se ha solucionado?
Más información: El servidor ejecuta la versión de 64 bit de .NET Framework (3.5 SP1) y en mi computadora portátil tengo instalados Visual Studio 2008 y el framework 3.5. La expresión regular es del siguiente patrón: ^word$|^word$|^word$
y está construido con las siguientes banderas: RegexOptions.IgnoreCase | RegexOptions.Compiled
Aquí es un fragmento de código:
StringBuilder regexString = new StringBuilder();
if (!String.IsNullOrEmpty(fileLocation))
{
XmlTextReader textReader = new XmlTextReader(fileLocation);
textReader.Read();
while (textReader.Read())
{
textReader.MoveToElement();
if (textReader.Name == "word")
{
regexString.Append("^" + textReader.GetAttribute(0) + "$|");
}
}
ProfanityFilter = new Regex(regexString.ToString(0, regexString.Length - 1), RegexOptions.IgnoreCase | RegexOptions.Compiled);
}
DateTime time = DateTime.Now;
Console.WriteLine("\nIsProfane:\n" + ProfanityFilter.IsMatch("test"));
Console.WriteLine("\nTime: " + (DateTime.Now - time).TotalSeconds);
Console.ReadKey();
Esto se traduce en un tiempo de 0,21 segundos en mi portátil y 23 segundos en el servidor 2008. El archivo XML consta de 168 palabras en el siguiente formato:
<word text="test" />
¿Qué tal código de muestra, para expresiones regulares y xml? –