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
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 –
¿Cuál es la proporción entre el tamaño en la memoria y el tamaño de los archivos en el disco? –
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