Napisałem aplikację .NET 4.5, która buforuje dane koloru, podczerwieni i głębokości z Kinect v2, wykonuje na nim pewne przetwarzanie, a następnie zrzuca je na dysk w nieskompresowanej formie; aplikacja .NET uruchamia także ffmpeg jako podproces i przesyła do niej kolorowe dane, które mają być zakodowane jako H.264.
Ponieważ nie używam dysku SSD, dane wideo docierają szybciej niż mogę zapisać na dysk. Ale to w porządku, dopuszczalne jest odrzucanie klatek wideo, gdy brakuje mi pamięci RAM. Moim jedynym wymaganiem jest to, aby cokolwiek trzymałem, to w większości ciągłe fragmenty wideo od 8 do 10 sekund. Dodałem więc trochę logiki do mojej aplikacji .NET 4.5, aby rozpocząć odrzucanie ramek wideo, gdy nie mam wystarczającej ilości pamięci RAM, aby buforować ciągłe 8 do 10 sekund wideo (około 1,5 do 2 GB).
Aby zapobiec przeładowaniu stron, całkowicie wyłączyłem pliki stronicowania. To daje mi 16 GB fizycznej pamięci RAM.
Mój problem polega na tym, że nawet przy takim mechanizmie czasami moja aplikacja .NET lub podproces ffmpeg wciąż giną, gdy Windows 8.1 obawia się o niską pamięć RAM, ponieważ oczywiście moja aplikacja używa najwięcej pamięci RAM, gdy ma ogromne zaległości danych wideo zapisywać na dysk. Czy istnieje sposób, aby powiedzieć systemowi Windows, że moje procesy są ważniejsze niż inne, aby system Windows najpierw zaczął zabijać inne mniej ważne procesy?
CreateMemoryResourceNotification
które jest o wiele mniej hackerskie.