Básicamente lo que me gustaría hacer es ejecutar varias (15-25) regex reemplaza en una sola cadena con la mejor gestión de memoria posible.C# Multiple Regex reemplaza en cadena - Demasiada memoria
Descripción general: Transmite un archivo de solo texto (a veces html) a través de ftp que se agrega a StringBuilder
para obtener una cadena muy grande. El tamaño del archivo oscila entre 300 KB y 30 MB.
Las expresiones regulares son semi-complejas, pero requieren múltiples líneas del archivo (identificando secciones de un libro, por ejemplo), así que romper arbitrariamente la cadena o ejecutar el reemplazo en cada ciclo de descarga está fuera de la respuesta.
Una muestra de reemplazar:
Regex re = new Regex("<A.*?>Table of Contents</A>", RegexOptions.IgnoreCase);
source = re.Replace(source, "");
Con cada ejecución de un reemplazar los cohetes cielo memoria, sé que esto se debe a String son inmutables en C# y tiene que hacer una copia - incluso si llamo GC.Collect()
se todavía no ayuda lo suficiente para un archivo de 30 MB.
Cualquier consejo sobre una mejor manera de acercarse, o una forma de realizar múltiples regex reemplaza usando memoria constante (hacer 2 copias (tan 60MB en memoria), realizar búsqueda, descartar copia de nuevo a 30MB)?
Actualización:
No parece ser una respuesta sencilla, pero para la gente del futuro mirando este Terminé usando una combinación de todas las respuestas a continuación para llegar a un estado aceptable:
Si es posible, divida la cadena en fragmentos, consulte la respuesta de manojs para ver cómo se está leyendo el archivo, buscando puntos finales adecuados.
Si no puede dividir como se transmite, al menos divídalo más tarde si es posible; consulte la respuesta de ChrisWue para algunas herramientas externas que pueden ayudar con este proceso para canalizar archivos.
Optimice la expresión regular, evite los operadores codiciosos y trate de limitar lo que el motor tiene que hacer tanto como sea posible - vea la respuesta de Sylverdrag.
Combine la expresión regular cuando sea posible, esto reduce el número de reemplazos para cuando las expresiones regulares no se basan entre sí (útil en este caso para limpiar entradas incorrectas) - vea la respuesta de Brian Reichle para una muestra de código.
¡Gracias a todos!
Llamo a cada expresión regular una vez en la cadena, ¿compilaré ayuda con la cantidad de veces que hace un reemplazo? Al igual que en la expresión regular de muestra, si había 500 coincidencias de tabla de contenido para reemplazar, ¿se ejecutaría una versión compilada más rápido? – WSkid
Lo siento, me di cuenta de mi error y eliminé mi comentario, pero ya me había respondido. Sí, la compilación puede no brindar beneficios para usted. – manojlds
No estoy seguro de si el requisito le permite analizar una línea de archivo. Si una línea en el archivo se puede considerar de forma independiente, entonces le sugiero que analice cada línea de archivo (CPU vs memoria ??) en lugar de todo el archivo en la memoria. Los ciclos/tiempo de la CPU pueden aumentar, pero creo que la memoria utilizada se reducirá. Puedes darle una oportunidad. –