J'ai écrit une application .NET 4.5 qui met en mémoire tampon les données de couleur, infrarouge et de profondeur d'un Kinect v2, effectue un traitement sur celui-ci, puis le sauvegarde sur disque, sous forme non compressée; l'application .NET démarre également ffmpeg en tant que sous-processus et lui redirige les données de couleur à encoder en H.264.
Parce que je n'utilise pas de SSD, les données vidéo arrivent plus rapidement que je ne peux écrire sur le disque. Mais ça va, il est acceptable pour moi de supprimer les images vidéo lorsque je manque de RAM. Ma seule exigence est que tout ce que je garde soit principalement des morceaux de vidéo contigus de 8 à 10 secondes. J'ai donc ajouté de la logique dans mon application .NET 4.5 pour commencer à supprimer les trames vidéo lorsque je n'ai pas assez de RAM pour mettre en mémoire tampon 8 à 10 secondes de vidéo contiguës (environ 1,5 à 2 Go).
Et, pour éviter le débordement de page, j'ai complètement désactivé les fichiers de pagination. Cela me laisse un total de 16 Go de RAM physique.
Mon problème est que même avec ce mécanisme en place, parfois mon application .NET ou le sous-processus ffmpeg sont toujours tués lorsque Windows 8.1 panique à propos de la faible RAM, car évidemment mon application utilise le plus de RAM lorsqu'elle a un énorme arriéré de données vidéo pour écrire sur le disque. Existe-t-il un moyen de dire à Windows que mes processus sont plus importants que d'autres afin que Windows commence par tuer d'autres processus moins importants?
CreateMemoryResourceNotification
laquelle est beaucoup moins hacky.