Eu escrevi um aplicativo .NET 4.5 que armazena em buffer dados de cores, infravermelho e profundidade de um Kinect v2, realiza algum processamento nele e o despeja em disco, de forma descompactada; o aplicativo .NET também inicia o ffmpeg como um subprocesso e canaliza dados de cores para que sejam codificados como H.264.
Como não estou usando um SSD, os dados do vídeo chegam mais rapidamente do que posso gravar no disco. Mas tudo bem, é aceitável descartar quadros de vídeo quando estou com pouca memória RAM. Meu único requisito é que tudo o que eu mantenho seja na maior parte contíguo em pedaços de vídeo de 8 a 10 segundos. Portanto, adicionei alguma lógica no meu aplicativo .NET 4.5 para começar a descartar os quadros de vídeo quando não tenho RAM suficiente para armazenar em buffer 8 a 10 segundos contíguos de vídeo (aproximadamente 1,5 a 2 GB).
E, para evitar o surto de página, desativei completamente os arquivos de paginação. Isso me deixa com um total de 16 GB de RAM física.
Meu problema é que, mesmo com esse mecanismo, às vezes meu aplicativo .NET ou o subprocesso ffmpeg ainda é morto quando o Windows 8.1 fica surtado com pouca memória RAM, porque obviamente meu aplicativo está usando mais memória RAM quando possui um grande estoque de dados de vídeo para gravar no disco. Existe uma maneira de dizer ao Windows que meus processos são mais importantes que outros, para que o Windows comece a matar outros processos menos importantes primeiro?
CreateMemoryResourceNotification
que é muito menos invasivo.