Escribí una aplicación .NET 4.5 que almacena datos de color, infrarrojos y profundidad de un Kinect v2, realiza un procesamiento en él y luego lo descarga en el disco, sin comprimir; la aplicación .NET también inicia ffmpeg como un subproceso y canaliza datos de color para que se codifiquen como H.264.
Como no estoy usando una SSD, los datos de video llegan más rápido de lo que puedo escribir en el disco. Pero está bien, es aceptable para mí descartar fotogramas de video cuando tengo poca RAM. Mi único requisito es que lo que sea que conserve sea en su mayoría fragmentos de video contiguos de 8 a 10 segundos. Así que agregué algo de lógica en mi aplicación .NET 4.5 para comenzar a descartar fotogramas de video cuando no tengo suficiente RAM para almacenar en búfer 8-10 segundos de video contiguos (aproximadamente 1.5 a 2 GB).
Y, para evitar la agitación de la página, he deshabilitado completamente los archivos de paginación. Esto me deja con un total de 16 GB de RAM física.
Mi problema es que, incluso con ese mecanismo, a veces mi aplicación .NET o el subproceso ffmpeg siguen sin funcionar cuando Windows 8.1 se asusta por la poca RAM, porque obviamente mi aplicación usa la mayor cantidad de RAM cuando tiene una gran cantidad de datos de video atrasados para escribir en el disco. ¿Hay alguna manera de decirle a Windows que mis procesos son más importantes que otros para que Windows comience a eliminar otros procesos menos importantes primero?
CreateMemoryResourceNotification
que es mucho menos hacky.