Ho scritto un'applicazione .NET 4.5 che memorizza in buffer dati a colori, a infrarossi e di profondità da un Kinect v2, esegue alcune elaborazioni su di esso e quindi li scarica su disco, in forma non compressa; l'applicazione .NET avvia anche ffmpeg come sottoprocesso e convoglia i dati dei colori su di esso per essere codificati come H.264.
Poiché non utilizzo un SSD, i dati video arrivano più velocemente di quanto riesca a scrivere su disco. Ma va bene, è accettabile per me scartare i frame video quando ho poca RAM. Il mio unico requisito è che qualunque cosa tenga per la maggior parte contigui pezzi di video da 8 a 10 secondi. Quindi ho aggiunto un po 'di logica nella mia applicazione .NET 4.5 per iniziare a scartare i frame video quando non ho abbastanza RAM per bufferizzare 8-10 secondi contigui di video (circa 1,5 a 2 GB).
E, per evitare il blocco della pagina, ho disabilitato completamente i file di paging. Questo mi lascia con un totale di 16 GB di RAM fisica.
Il mio problema è che anche con quel meccanismo in atto, a volte la mia applicazione .NET o il sottoprocesso di ffmpeg vengono ancora uccisi quando Windows 8.1 impazzisce per la RAM bassa, perché ovviamente la mia applicazione utilizza la maggior quantità di RAM quando ha un enorme arretrato di dati video per scrivere su disco. C'è un modo per dire a Windows che i miei processi sono più importanti di altri in modo che Windows inizierebbe a uccidere prima altri processi meno importanti?
CreateMemoryResourceNotification
quale è molto meno complicato.