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.Respuestas:
Windows no mata los procesos cuando se usa toda la RAM. Lo que realmente sucede es que los procesos no pueden asignar memoria y fallar.
Esto sucede porque toda su memoria física está en uso y porque el archivo de paginación está deshabilitado, el administrador de memoria ya no tiene la capacidad de escribir páginas que no se están utilizando. Esto mantiene su RAM física llena y cuando su proceso, o cualquier otra cosa que se esté ejecutando en ese momento, intenta asignar una página, falla. Algunas aplicaciones se bloquean.
Esta presentación de Technet explica: http://channel9.msdn.com/Events/TechEd/NorthAmerica/2011/WCL405
El archivo de paginación evita que las aplicaciones se bloqueen cuando utiliza toda su memoria al actuar como un respaldo para el compromiso excesivo.
La memoria virtual es más o menos la base de cómo los sistemas operativos modernos asignan recursos, por lo que se trata de tener cosas en la RAM que están en uso y mover cosas dentro y fuera del disco.
En realidad solo hay dos respuestas:
La conclusión es que la RAM es solo otro nivel de caché, y todo lo relacionado con la memoria virtual, los archivos de paginación, los archivos mapeados de memoria, y todo eso básicamente se reduce a esto: si se está quedando sin memoria, debe agregar más.
fuente
Vaya a través del Panel de herramientas de Windows y Configuración avanzada y desactive cosas innecesarias, como efectos de ventana si aún no lo ha hecho, y obtenga Sysinternals Process Explorer y / o System Monitor para encontrar y apagar cualquier cosa extraña que esté desperdiciando CPU o memoria.
Más importante aún, use Process Explorer y / o System Monitor para ver cómo se ejecuta su programa y ver exactamente dónde y cómo falla. ¿Qué subproceso se queda sin memoria y muere primero: el prgm principal o la parte ffmpeg? ¿Existe un dll específico u otro recurso compartido que aumenta de tamaño inesperadamente? ¿O la ejecución se lleva a cabo correctamente, excepto que muerde más de lo que puede masticar datos?
Descubrir con mayor precisión la naturaleza de su problema probablemente lo guiará en la dirección de una solución. Podría, por ejemplo, implementar su política de caída de tramas de manera más agresiva, mientras optimiza mejor su criterio de fragmentación de 8-10 segundos para lograr una sobrecarga general de RAM más baja
Sugerencias finales: tal vez considere cambiar a Linux, y mientras tanto, vuelva a habilitar el archivo de paginación (Linux lo llama el espacio de intercambio, lo que lo hace sonar más divertido, en mi humilde opinión, ¡como una reunión de intercambio o algo así!) ¡Buena suerte!
fuente