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.