2009-09-15 18 views
8

He escrito un programa que analiza el código fuente de un proyecto e informa varios problemas y métricas basadas en el código.Prevención de problemas de memoria al manejar grandes cantidades de texto

Para analizar el código fuente, cargo los archivos de código que existen en la estructura de directorios del proyecto y analizo el código de la memoria. El código pasa por un procesamiento extenso antes de pasarlo a otros métodos para analizarlo más a fondo.

El código se pasa a varias clases cuando se procesa.

El otro día lo estaba ejecutando en uno de los proyectos más grandes de mi grupo, y mi programa se vino abajo porque había demasiado código fuente cargado en la memoria. Este es un caso de esquina en este punto, pero quiero ser capaz de manejar este problema en el futuro.

¿Cuál sería la mejor manera de evitar problemas de memoria?

Estoy pensando en cargar el código, hacer el procesamiento inicial del archivo, luego serializar los resultados en el disco, para que cuando necesite acceder a ellos nuevamente, no tenga que pasar por el proceso de manipular el código sin procesar de nuevo. ¿Esto tiene sentido? ¿O la serialización/deserialización es más costosa que el procesamiento del código nuevamente?

Quiero mantener un nivel razonable de rendimiento al abordar este problema. La mayoría de las veces, el código fuente encajará en la memoria sin problemas, entonces ¿hay alguna forma de "localizar" mi información solo cuando tengo poca memoria? ¿Hay alguna forma de saber cuándo mi aplicación se está quedando sin memoria?

Actualización: El problema no es que un solo archivo llene la memoria, todos sus archivos en la memoria a la vez llenan la memoria. Mi idea actual es girar fuera de la unidad de disco cuando los proceso

+1

Me gustaría ir con el enfoque de serialización. Pero eche un vistazo al código fuente de FindBug. Hacen algo similar y tal vez ya hayan resuelto este problema: http://findbugs.sourceforge.net/downloads.html –

+0

¿Cuál es la proporción entre el tamaño en la memoria y el tamaño de los archivos en el disco? –

+0

Ha mencionado pasar cadenas entre clases. Dependiendo de cómo manipule las cadenas, quizás se estén haciendo algunas copias y esté consumiendo más memoria de la que necesita. No sé exactamente cómo maneja C# las cadenas que pasan, pero si las replica, ese puede ser el problema. – rsethc

Respuesta

3

1.6 GB sigue siendo manejable y por sí solo no debería causar problemas de memoria. Las operaciones de cadena ineficientes pueden hacerlo.

Al analizar el código fuente, probablemente lo divida en ciertas subcadenas - tokens o como quiera que los llame. Si los tokens combinados representan el código fuente completo, eso duplica el consumo de memoria allí mismo. Dependiendo de la complejidad del procesamiento que realice, el mutiplicador puede ser incluso más grande. Mi primer paso aquí sería estudiar de cerca cómo usar las cadenas y encontrar una manera de optimizarlo, es decir, descartar el origianl después de la primera pasada, comprimir los espacios en blanco, o usar índices (punteros) a las cadenas originales en lugar de que las subcadenas reales: hay una serie de técnicas que pueden ser útiles aquí.

Si nada de esto ayudaría, me gustaría intercambiarlos de un lado a otro del disco

+0

Esto tiene sentido, porque tengo varios estados del archivo disponible, probablemente aumentando el tamaño tres veces –

0

Use WinDbg con SOS para ver qué contiene las referencias de cadenas (o lo que está causando el uso extremo de la memoria).

+0

Tiene que ver con el hecho de que la carpeta que estaba analizando era de 1,6 GB (incluidos los binarios compilados, pero no los estoy cargando, la cantidad de código sigue siendo enorme) –

0

Serializar/deserializar suena como una buena estrategia. He hecho una buena cantidad de esto y es muy rápido. De hecho, tengo una aplicación que crea instancias de objetos de un DB y luego los serializa en los discos duros de mis nodos web. Ha pasado un tiempo desde que lo evalué, pero estaba serializando varios cientos por segundo y tal vez más de 1k cuando estaba realizando pruebas de carga.

Por supuesto, dependerá del tamaño de los archivos de código. Mis archivos eran bastante pequeños.

1

Si el problema es que una sola copia de tu código hace que llenes la memoria disponible, entonces hay al menos dos opciones.

  • serializar en el disco
  • comprimir archivos en la memoria. Si tiene una gran cantidad de CPU, puede ser más rápido comprimir y descomprimir información en la memoria, en lugar de almacenarla en el disco.

También debe verificar si se está deshaciendo de los objetos correctamente. ¿Tiene problemas de memoria debido a copias antiguas de objetos que están en la memoria?

Cuestiones relacionadas