El problema es simple Tengo un proceso, que hace ETL en algunos archivos xml. Comenzamos a obtener archivos xml realmente grandes y comencé a recibir OutOfMemoryExceptions.Cómo hacer que un proceso .NET se quede sin memoria sin agotar toda la memoria del sistema
La reparación del proceso es relativamente simple. Sin embargo, me gustaría hacer una prueba unitaria para mi suite NUnit para asegurarme de que el proceso continúe siendo capaz de manejar archivos realmente grandes. Sin embargo, en realidad, la falta de memoria en mi estación de trabajo de desarrollo ralentiza mi máquina y consume mucho tiempo. También es una mala idea guardar un archivo de prueba enorme en el control de versiones. Si pudiera limitar artificialmente un proceso, thread o appdomain para usar solo una cantidad fija de ram, digamos 128 megas, podría hacer una prueba unitaria más pequeña que no llevara a mi estación de trabajo, de rodillas.
¿Alguna sugerencia? ¿Hay alguna API no administrada que pueda P/Invocar?
Yo no quiero poner esto en mi respuesta principal, porque no está respondiendo exactamente a su pregunta, pero es algo que suena como una cosa rara de probar la unidad. En un nivel alto, su algoritmo para leer los archivos manejará archivos muy grandes de tamaño arbitrario (porque transmite o corta el archivo) o no lo hará. Eso no va a cambiar muy seguido, si es que lo hace, y no veo lo que gana al probarlo cada vez con su conjunto de pruebas, especialmente dado que (si falla) puede no fallar de manera confiable cada vez en un determinado archivo. – mquander
Abro y escaneo el archivo varias veces. A veces lo hago como una transmisión, a veces no lo hago. El 99.9% de los archivos que escaneo son lo suficientemente pequeños como para poder cargar todo el archivo en la memoria. El otro .01% necesita procesar. Por lo tanto, si realizo todas las operaciones de archivo en secuencia (solucionando el problema), alguien podría agregar un nuevo paso que procese el archivo cargándolo todo en la memoria. Sin una prueba unitaria que realice toda la operación de ETL en un archivo lo suficientemente grande como para consumir todo el ram de procesamiento, esto lo convertirá en producción, ya que el control de calidad podría no probar el sistema con un archivo realmente grande. –
Creo que la mejor respuesta aquí es encapsular las operaciones que necesita hacer muy bien, por lo que es difícil para cualquier otra persona ir accidentalmente por la ruta de manejar el archivo y abrir todo para intentar buscar algo. Por supuesto, alguien aún podría ir y piratear su jungla para abrir todo el archivo si lo intentaran lo suficiente, pero creo que podría evitar que alguien lo haga por pura ignorancia. (Sé que esto es accesorio a la discusión sobre cómo probarlo, pero la prevención es la mejor cura). – mquander