Pregunta

Tengo un registro de excepción de una de las liberaciones de código de producción.

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()

Los datos intenta procesar fue de aproximadamente 800 KB.

En mis pruebas locales funciona perfectamente bien. ¿Alguna vez ha visto un comportamiento similar, lo que puede ser la causa?

he de dividir el texto antes de procesarlo, pero es evidente que en ese caso la expresión regular podría no coincidir debido a la división del archivo original desde un lugar al azar.

Mis expresiones regulares:

EDIT 2:

Creo que este RegEx en particular está causando el problema, cuando lo pruebo a cabo en un entorno aislado que está comiendo la memoria instantánea.

((?:( |\.\.|\.|""|'|=)[\/|\?](?:[\w#!:\.\?\+=&@!$'~*,;\/\(\)\[\]\-]|%[0-9a-f]{2})*)( |\.|\.\.|""|'| ))?

Editar

que estaba siendo malo con mi prueba local. Estaba preparando una cadena grande a continuación, añadiendo cosas a la misma que hace .NET Framework mareado y luego dar una excepción OOM durante la expresión regular en lugar de durante las operaciones de cadena (o al azar, así que ignore las cosas que he dicho anterior).

Esta es una aplicación de .NET Framework 2.0.

¿Fue útil?

Solución

Sin ver su expresión regular, no lo sé con seguridad, pero a veces se puede conseguir este tipo de problemas porque sus partidos son codiciosos en lugar de Lazy.

El motor de expresiones regulares tiene que almacenar gran cantidad de información internamente y partidos Greedy puede llegar a causar la expresión regular para seleccionar grandes sectores de la cadena de 800k, muchas veces más.

Hay una buena información acerca de este sobre aquí .

Otros consejos

Sobre la base de su edición, que suena como su código puede ser la creación de cadenas que absorben grandes cantidades de memoria. Esto significaría que, aunque la excepción de memoria insuficiente se genera desde dentro del código expresión regular, no es en realidad debido a la propia expresión regular está tomando demasiada memoria. Por lo tanto, si se utiliza StringBuilder en su propio código resuelve el problema, entonces eso es lo que debe hacer.

Lo primero que me gustaría probar, si es posible para su aplicación, sería dividir la entrada.

¿Sería posible leer el archivo (si la entrada es un archivo), línea por línea, aplicando la expresión regular de esa manera?

Se debe echar un vistazo a CLR Profiler . Se puede tomar un poco de tiempo para aprender a usar, pero vale la pena. Se le ayudará a visualizar la cantidad de memoria utilizan sus objetos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top