Das Problem ist einfach Ich habe einen Prozess, der ETL auf einigen XML-Dateien tut. Wir haben wirklich große XML-Dateien bekommen und ich habe OutOfMemoryExceptions bekommen.Wie man einen .NET-Prozess aus dem Speicher laufen lässt, ohne den gesamten Systemspeicher zu erschöpfen
Das Fixieren des Prozesses ist relativ einfach. Ich möchte jedoch einen Komponententest für meine NUnit-Suite machen, um sicherzustellen, dass der Prozess auch weiterhin mit wirklich großen Dateien umgehen kann. Wenn ich jedoch den Arbeitsspeicher meiner Entwicklungs-Workstation nicht mehr benötige, wird mein Rechner langsamer und zeitaufwendiger. Es ist auch keine gute Idee, eine riesige Testdatei in der Versionskontrolle zu speichern. Wenn ich einen Prozess künstlich begrenzen könnte, Thread oder Anwendungsdomäne nur eine feste Menge RAM verwenden, sagen wir 128 MB, könnte ich einen kleineren Komponententest machen, der meine Workstation nicht in die Knie zwingen würde.
Irgendwelche Vorschläge? Ist ihre nicht verwaltete API kann ich P/Invoke?
ich nicht setzen in meinem Haupt-Antwort aktivieren möchten, weil es nicht genau ist Ihre Frage zu beantworten, aber das klingt wie eine seltsame Sache zu Unit-Test. Auf einer hohen Ebene behandelt entweder Ihr Algorithmus zum Lesen der Dateien sehr große Dateien beliebiger Größe (weil sie die Datei streamen oder chunks) oder nicht. Das wird sich nicht oft ändern, wenn überhaupt, und ich sehe nicht, was Sie davon haben, es jedes Mal mit Ihrer Testsuite zu testen, besonders angesichts der Tatsache, dass es (wenn es scheitert) nicht jedes Mal zuverlässig versagen kann Datei. – mquander
Ich öffne und scanne die Datei mehrmals. Manchmal mache ich es als Stream, manchmal nicht. 99,9% der gescannten Dateien sind klein genug, um die gesamte Datei in den Speicher zu laden. Die anderen .01% müssen verarbeiten. Wenn ich also alle Dateioperationen stream-basiert mache (das Problem behebend), könnte jemand einen neuen Schritt hinzufügen, der die Datei verarbeitet, indem sie alles in den Speicher lädt. Ohne einen Komponententest, der die gesamte ETL-Operation für eine Datei ausführt, die groß genug ist, um den Verarbeitungs-RAM zu essen, wird dies in die Produktion übergehen, da QA das System möglicherweise nicht mit einer wirklich großen Datei testen kann. –
Ich denke, dass die beste Antwort hier ist, die Operationen zu kapseln, die man sehr gut machen muss, so dass es für jeden anderen unmöglich ist, den Pfad der Datei zu umgehen und das Ganze zu öffnen, um etwas zu holen. Natürlich könnte jemand immer noch durch deinen Dschungel hacken, um die ganze Akte zu öffnen, wenn sie es hart genug versuchen, aber ich denke, dass du jemanden aus reiner Unwissenheit daran hindern kannst, es zu tun. (Ich weiß, dass dies zur Diskussion darüber, wie man es testet, nebenbei ist, aber Prävention ist die beste Heilung.) – mquander