Il problema è semplice Ho un processo, che fa ETL su alcuni file xml. Abbiamo iniziato a ottenere file xml veramente grandi e ho iniziato a ricevere OutOfMemoryExceptions.Come eseguire un processo .NET esaurito la memoria senza esaurire tutta la memoria di sistema
La riparazione del processo è relativamente semplice. Tuttavia, mi piacerebbe fare un test unitario per la mia suite NUnit per assicurarmi che il processo continui a essere in grado di gestire file veramente grandi. Tuttavia, l'esaurimento della memoria nella mia workstation di sviluppo rallenta la mia macchina e richiede molto tempo. Anche memorizzare un file di test gigantesco nel controllo della versione è una cattiva idea. Se potessi limitare artificialmente un processo, thread o appdomain per usare solo una quantità fissa di ram, diciamo 128 meg, potrei fare un test di unità più piccolo che non porterebbe la mia workstation in ginocchio.
Qualche suggerimento? La loro qualche API non gestita posso P/Invoke?
Non volevo mettere questo nella mia risposta principale, perché non è esattamente rispondere alla tua domanda, ma questo suona proprio come una cosa strana per unit test. Ad un livello elevato, il tuo algoritmo per la lettura dei file gestirà file molto grandi di dimensioni arbitrarie (perché flussi o blocchi il file) o non lo farà. Questo non cambierà molto spesso, se mai, e non vedo cosa guadagni provandolo ogni volta con la tua suite di test, specialmente dato che (se fallisce) potrebbe non fallire in modo affidabile ogni volta su un dato file. – mquander
Apro e scrivo il file più volte. A volte lo faccio come un flusso, a volte no. Il 99,9% dei file che scrivo sono abbastanza piccoli da poter caricare l'intero file in memoria. L'altro 0,01% deve essere elaborato. Pertanto, se faccio in modo che tutto il flusso delle operazioni dei file sia basato (risolvendo il problema), qualcuno potrebbe aggiungere un nuovo passaggio che elabora il file caricandolo tutto in memoria. Senza un test unitario che esegue l'intera operazione ETL su un file abbastanza grande da occupare tutta la ram di elaborazione, questo lo renderà in produzione, perché il QA potrebbe non testare il sistema con un file molto grande. –
Penso che la migliore risposta qui sia quella di incapsulare le operazioni che devi fare molto bene, in modo che sia difficile per chiunque accidentalmente andare lungo il percorso di ottenere l'handle del file e aprire l'intera cosa per cercare di recuperare qualcosa. Certo, qualcuno potrebbe ancora andare e hackerare nella tua giungla per aprire l'intero file se si fossero sforzati abbastanza, ma penso che potresti impedire a chiunque di farlo per pura ignoranza. (So che questo è accessorio alla discussione su come testarlo, ma la prevenzione è la migliore cura.) – mquander