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.Réponses:
Windows ne tue pas les processus lorsque toute la RAM est utilisée. En réalité, les processus ne parviennent pas à allouer de la mémoire et se bloquent.
Cela se produit car toute votre mémoire physique est en cours d'utilisation et parce que le fichier d'échange est désactivé, le gestionnaire de mémoire n'a plus la possibilité d'écrire des pages qui ne sont pas utilisées. Cela garde votre RAM physique pleine et lorsque votre processus, ou toute autre chose en cours d'exécution à ce moment-là, essaie d'allouer une page, il échoue. Certaines applications se bloquent.
Cette présentation de Technet explique: http://channel9.msdn.com/Events/TechEd/NorthAmerica/2011/WCL405
Le fichier d'échange empêche les applications de se bloquer lorsque vous utilisez toute votre mémoire en agissant comme un filet de sécurité pour le sur-engagement.
La mémoire virtuelle est à peu près le fondement de la façon dont les systèmes d'exploitation modernes allouent les ressources, il s'agit donc d'avoir des éléments dans la RAM qui sont en cours d'utilisation et de déplacer des éléments vers et depuis le disque.
Il n'y a vraiment que deux réponses:
L'essentiel est que la RAM n'est qu'un autre niveau de cache, et tout ce qui concerne la mémoire virtuelle, les fichiers d'échange, les fichiers mappés en mémoire, et tout cela se résume à ceci: si vous manquez de mémoire, vous devez ajouter plus.
la source
Allez dans le panneau d'outils Windows et les paramètres avancés et désactivez les choses inutiles, comme les effets de fenêtre si vous ne l'avez pas déjà fait, et demandez à Sysinternals Process Explorer et / ou System Monitor de trouver et de désactiver tout ce qui est inutile qui gaspille le processeur ou la mémoire.
Plus important encore, utilisez Process Explorer et / ou System Monitor pour observer l'exécution de votre programme et voir exactement où et comment il échoue. Quel thread manque de mémoire et meurt en premier - le prgm principal ou la partie ffmpeg? Existe-t-il une DLL spécifique ou une autre ressource partagée dont la taille augmente de façon inattendue? Ou l'exécution se déroule-t-elle correctement, sauf en mordant plus qu'elle ne peut mâcher les données?
Déterminer plus précisément la nature de votre problème vous orientera probablement vers une solution. Vous pouvez, par exemple, mettre en œuvre votre politique de suppression de trame de manière plus agressive, tout en optimisant mieux votre critère de bloc de 8 à 10 secondes pour réduire la surcharge globale de RAM
Suggestions finales: envisagez peut-être de passer à Linux, et en attendant, réactivez le fichier d'échange (Linux l'appelle l'espace de swap, ce qui le rend plus amusant à mon humble avis, comme un swap-meet ou quelque chose!) Bonne chance.
la source