Ich habe eine .NET 4.5-Anwendung geschrieben, die Farb-, Infrarot- und Tiefendaten von einem Kinect v2 puffert, einige Verarbeitungsschritte ausführt und diese dann in unkomprimierter Form auf die Festplatte kopiert. Die .NET-Anwendung startet ffmpeg auch als Unterprozess und leitet Farbdaten zur Kodierung als H.264 weiter.
Da ich keine SSD verwende, kommen die Videodaten schneller an, als ich auf die Festplatte schreiben kann. Aber das ist in Ordnung. Es ist für mich akzeptabel, Videobilder zu verwerfen, wenn der Arbeitsspeicher knapp ist. Meine einzige Anforderung ist, dass alles, was ich behalte, größtenteils zusammenhängende 8- bis 10-Sekunden-Videostücke sind. Daher habe ich in meiner .NET 4.5-Anwendung eine Logik hinzugefügt, mit der ich anfange, Videobilder zu verwerfen, wenn ich nicht genug RAM habe, um zusammenhängende 8 bis 10 Sekunden Video zu puffern (ungefähr 1,5 bis 2 GB).
Und um ein Überladen der Seiten zu verhindern, habe ich Auslagerungsdateien vollständig deaktiviert. Dadurch habe ich insgesamt 16 GB physischen Arbeitsspeicher.
Mein Problem ist, dass selbst mit diesem Mechanismus manchmal meine .NET-Anwendung oder der ffmpeg-Unterprozess immer noch abstürzen, wenn Windows 8.1 wegen des niedrigen Arbeitsspeichers ausfällt, da meine Anwendung offensichtlich den meisten Arbeitsspeicher verwendet, wenn es einen großen Rückstand an Videodaten gibt auf die Festplatte schreiben. Gibt es eine Möglichkeit, Windows mitzuteilen, dass meine Prozesse wichtiger sind als andere, sodass Windows andere weniger wichtige Prozesse zuerst beendet?
CreateMemoryResourceNotification
die viel weniger hackig ist.Antworten:
Windows bricht keine Prozesse ab, wenn der gesamte Arbeitsspeicher verwendet wird. Was tatsächlich passiert, ist, dass Prozesse keinen Speicher zuweisen und abstürzen.
Dies geschieht, weil der gesamte physische Speicher verwendet wird und weil die Auslagerungsdatei deaktiviert ist, kann der Speichermanager keine Seiten mehr schreiben, die nicht verwendet werden. Dadurch bleibt der physische Arbeitsspeicher voll, und wenn Ihr Prozess oder eine andere gerade ausgeführte Komponente versucht, eine Seite zuzuweisen, schlägt dies fehl. Einige Anwendungen stürzen ab.
In dieser Präsentation von Technet wird Folgendes erläutert: http://channel9.msdn.com/Events/TechEd/NorthAmerica/2011/WCL405
Die Auslagerungsdatei verhindert, dass Anwendungen abstürzen, wenn Sie den gesamten Speicher ausnutzen, indem Sie als Rückstopp für die Überbeanspruchung fungieren.
Virtueller Speicher ist so ziemlich das Fundament dafür, wie moderne Betriebssysteme Ressourcen zuweisen. Es geht also darum, dass Dinge im RAM verwendet werden und dass Dinge auf die Festplatte verschoben werden.
Es gibt wirklich nur zwei Antworten:
Das Fazit ist, dass RAM nur eine weitere Cache-Ebene ist und all das, was mit virtuellem Speicher, Auslagerungsdateien, Speicherzuordnungsdateien zu tun hat, und alles, was im Grunde dazugehört: Wenn Ihnen der Speicher ausgeht, müssen Sie hinzufügen Mehr.
quelle
Durchsuchen Sie die Windows-Systemsteuerung und die erweiterten Einstellungen und deaktivieren Sie nicht benötigte Elemente, z. B. Fenstereffekte, sofern Sie dies noch nicht getan haben, und lassen Sie Sysinternals Process Explorer und / oder System Monitor nach fremden Elementen suchen und diese deaktivieren, die CPU oder Speicher verschwenden.
Noch wichtiger ist, dass Sie Process Explorer und / oder System Monitor verwenden, um zu beobachten, wie Ihr Programm ausgeführt wird, und genau zu sehen, wo und wie es fehlschlägt. Welcher Thread hat zu wenig Speicher und stirbt zuerst - das Hauptprogramm oder der ffmpeg-Teil? Gibt es eine bestimmte DLL oder eine andere freigegebene Ressource, deren Größe unerwartet steigt? Oder läuft die Ausführung korrekt ab, außer dass mehr abgebissen wird, als Daten eingekaut werden können?
Wenn Sie die Art Ihres Problems genauer herausfinden, werden Sie wahrscheinlich in die Richtung einer Lösung weisen. Sie können beispielsweise Ihre Richtlinie zum Löschen von Frames aggressiver implementieren und gleichzeitig die Optimierung für Ihr 8-10-Sekunden-Chunk-Kriterium optimieren, um insgesamt einen geringeren RAM-Overhead zu erzielen
Letzte Vorschläge: Vielleicht überlegen Sie, auf Linux umzusteigen, und aktivieren Sie in der Zwischenzeit die Auslagerungsdatei erneut (Linux nennt sie den Auslagerungsbereich, wodurch es meiner Meinung nach lustiger klingt, wie eine Auslagerungssitzung oder so!). Viel Glück.
quelle