Error de sistema "Demasiados ficheros abiertos" con Mediaplayer - Versión para impresión +- Comunidad Gambas-es (https://gambas-es.org) +-- Foro: Gambas (https://gambas-es.org/forum-3.html) +--- Foro: General (https://gambas-es.org/forum-4.html) +--- Tema: Error de sistema "Demasiados ficheros abiertos" con Mediaplayer (/thread-1955.html) |
Error de sistema "Demasiados ficheros abiertos" con Mediaplayer - chescobar - 09-05-2025 Al usar MediaPlayer como reproductor en una aplicación 24/7 - 365 se tiene el problema que luego de operar cerca de 24 horas se alcanza el límite del máximo de ficheros abiertos por la aplicación. Luego de la reproducción de cada tema se tiene la precaución de cerrar el reproductor MediaPlayer con .stop y .close. Adicionalmente, luego de reproducir cada tema y aún con .stop y .close el uso de la memoria RAM se va incrementando, así luego de las 24 horas alcanza 256 MB, lo que quiere decir que en 10 días serían 2.5 GB y en un mes 7.5 GB (fuera RAM ![]() El tarball del código fuente (GNU/GLP ![]() https://gradio.net/descargas/GR6/GR6-src/GR-MPlayer.zip dependencias: mediainfo libsox-fmt-all darkice (sudo apt install mediainfo libsox-fmt-all darkice) Por ahora la solución para el número de ficheros abiertos puede ser incrementar ulimit a nivel de SO, pero el incremento de memoria a medida que pasa el tiempo si terminaría por colgar la máquina en algún momento. Me comentan si tienen alguna idea. Saludos. RE: Error de sistema "Demasiados ficheros abiertos" con Mediaplayer - Shordi - 10-05-2025 Tu código es demasiado complejo y tiene demasiadas dependencias (no quiero instalar nada, que luego me lío), para hacer un debug real, pero le he echado un vistazo y veo que utilizas las instancias de mplayer como variables públicas, a las que continuamente asignas una nueva instancia. No sé muy bien qué efecto tiene eso, quiero decir que cada vez que haces un new, a la variable se le asigna una dirección de memoria nueva y se almacena ahí la nueva instancia... pero no sabemos qué ocurre con toda la memoria que estaba ocupada en la dirección de memoria anterior. Gambas no tiene "recogida de basura" como otros compiladores, por lo que tal vez estés dejando "cosas colgadas" cada vez que reasignas esos new a las variables públicas. Tres cosas, desde esta perspectiva, puedes hacer: O utilizas variables locales o privadas al evento que usas, de manera que "se destruyan" al finalizar el mismo, o no utilizas el new, sino que te limitas a parar la reproducción y cargar el nuevo audio en el mismo mplayer o, quizá, destruyes la variable pública antes de asignar una nueva dirección: mp1.Delete() o mp1 = null, en la línea anterior a With mp1 = New MediaPlayer As "MediaPlayer1", por ejemplo. No sé si este "análisis" es bueno, que ya te digo que no lo he probado, pero por probarlo no pierdes nada. Saludos RE: Error de sistema "Demasiados ficheros abiertos" con Mediaplayer - chescobar - 11-05-2025 Si había probado asignarle Null a la instancia de reproducción, pero extrañamente cuando los haces, le agrega 100 kb de uso a la memoria, adicionalmente a lo que ha consumido y asignado luego de terminar de reproducir un tema. Usa variables públicas para que se comuniquen y enviar señales de control entre los reproductores Mediaplayer (dos principales y uno para efectos), para poder hacer el fundido de los temas musicales, caso contrario solo tendrías la opción de reproducir un tema tras otro, mientras que acá puedes definir el tiempo de fundido entre temas (por defecto 5 segundos) y tirar efectos como pisadores, mientras se reproduce un tema. Las versiones previas no usaban la librería nativa de MediaPlayer sino mplayer de bash y luego mpv que corrían en paralelo desde un script de BASH y Gambas era mas bien una interfaz hacia el usuario, por eso se migró a una de la librerías que corren nativamente con Gambas, la que mejor se comportó en las pruebas, con la ventaja que se puede usar mas limpiamente los métodos de la librería (pausa, seek, stop, etc). El problema de crecimiento de memoria se da también con libvlc, por tanto entiendo que va mas con el hecho que el compilador no va limpiando la memoria de lo que va usando y de alguna manera, a pesar de que se cerró la instancia del reproductor el sistema operativo interpreta que va acumulando ficheros abiertos en paralelo. Otro problema que encontré con las librerías nativas para reproducir audio/video es que no siempre pueden calcular el tiempo de duración de los archivos multimedia, por eso tiene un condicionante que de no poder calcular el tiempo con MediaPlayer, lo haga con mediainfo de BASH o soxi (libsox-fmt-all) o mplayer (de BASH, no mediaplayer de Gambas3). Habrá que seguir probando. RE: Error de sistema "Demasiados ficheros abiertos" con Mediaplayer - Shordi - 11-05-2025 En mi única experiencia con mediaplayer, que es mi programa linamp (un trasunto de audacious) utilizo ffmpeg para el cálculo de tiempos. Recuerdo que estuve haciendo comparativas y era el más rápido de los que probé. Lo de aumento de memoria nunca lo he notado... claro, que linamp no es 24/7/365... ni mucho menos ![]() ![]() ![]() Que tengas suerte con el tema (te iba a sugerir usar reproductores externos... o probar a hacer forks... etc. pero sería meterte en berenjenales profundos sin garantía de nada). Saludos |