Foros del Web » Programación para mayores de 30 ;) » .NET »

Problema de memoria con ciclo for each

Estas en el tema de Problema de memoria con ciclo for each en el foro de .NET en Foros del Web. Saludos a todos, vengo con problema que no llego a comprender bien. Estoy usando un ciclo for each para recorrer un directorio y listar todos ...
  #1 (permalink)  
Antiguo 28/12/2016, 04:41
Avatar de Remy_Lebaut  
Fecha de Ingreso: junio-2013
Mensajes: 24
Antigüedad: 10 años, 10 meses
Puntos: 1
Problema de memoria con ciclo for each

Saludos a todos, vengo con problema que no llego a comprender bien. Estoy usando un ciclo for each para recorrer un directorio y listar todos los archivos de música en un listbox.

Luego cuando ya tengo todas las rutas en el listbox, me dispongo a usar la librería de "Perry’s ID3 Tag Library" para extraer por ejemplo el artista de cada uno de esos items de listbox y para no mesclarlos los envió a un segundo listbox. y para esto me valgo de otro ciclo for each y ahí viene el problema, después de hacer el procedimiento y conseguir los primeros 25 a 50 tag el ciclo me tira un error de memoria.

Acá dejo el código haber si alguien me puede explicar lo que estoy haciendo mal.

Código:
 For Each Archivo As String In My.Computer.FileSystem.GetFiles(StorePath, FileIO.SearchOption.SearchAllSubDirectories, "*.mp3", "*.wav", "*.wma")
                
                Dim mp3 As New ID3TagLibrary.MP3File(Archivo)    
                    
                  ListBox.Items.Add(mp3.Artist)                
                End With
Next

Y el error que tira es "System.OutOfMemoryException"
Bueno espero que alguien me sepa explicar mi error..
  #2 (permalink)  
Antiguo 28/12/2016, 18:26
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: Problema de memoria con ciclo for each

Es un memory leak en toda regla. Estás usando objetos y que al dejar de usar no haces su Dispose, con lo que queda la memoría reservada pero sin usarse (hasta que pase el Garbage Collector).

No tengo la API que estás usando a mano, pero revisa si la clase ID3TagLibrary.MP3File tiene algún metodo para liberarla (normalmente el Dispose).
__________________
Aviso: No se resuelven dudas por MP!
  #3 (permalink)  
Antiguo 29/12/2016, 03:41
Avatar de Remy_Lebaut  
Fecha de Ingreso: junio-2013
Mensajes: 24
Antigüedad: 10 años, 10 meses
Puntos: 1
Respuesta: Problema de memoria con ciclo for each

Muchas gracias por tu respuesta, estoy mirando la web de la libreria y si existe métodos para desechar, en un comentario menciona algo de "dispose". Aunque no estoy seguro de como usar esto. Como le digo a mi ciclo for each que deseche los objetos ya recorridos? me falta logica, no me llego a dar cuenta porque no lo he comprendido bien el funcionamiento del ciclo en estos casos...

Esta es la web de la libreria...

[URL="http://glassocean.net/perrys-id3-tag-library/"]http://glassocean.net/perrys-id3-tag-library/[/URL]
  #4 (permalink)  
Antiguo 29/12/2016, 10:53
Avatar de Rodrhigo  
Fecha de Ingreso: septiembre-2011
Ubicación: Temuco-Valdivia-Osorno
Mensajes: 254
Antigüedad: 12 años, 7 meses
Puntos: 48
Respuesta: Problema de memoria con ciclo for each

Antes del Next coloca mp3.Dispose(); o mp3.Close();.
Otra opción es usar using
Código vb.net:
Ver original
  1. using(ID3TagLibrary.MP3File mp3 As New ID3TagLibrary.MP3File(Archivo)){
  2. ListBox.Items.Add(mp3.Artist)
  3. }
Desconozco si la sintaxis es correcta
__________________
Rodrigo Agüero
  #5 (permalink)  
Antiguo 29/12/2016, 13:35
Avatar de Remy_Lebaut  
Fecha de Ingreso: junio-2013
Mensajes: 24
Antigüedad: 10 años, 10 meses
Puntos: 1
Respuesta: Problema de memoria con ciclo for each

Gracias por tu aporte, pero no me ha funcionado... al parecer no encuentro el método en esta libreria para librar la memoria en el ciclo..

aca una vista de la libreria..



yo creo que ha de existir algún método pero no tengo la suficiente experiencia para solucionarlo...
  #6 (permalink)  
Antiguo 01/01/2017, 12:02
Avatar de Drako_18  
Fecha de Ingreso: mayo-2005
Ubicación: Madrid
Mensajes: 505
Antigüedad: 18 años, 11 meses
Puntos: 16
Respuesta: Problema de memoria con ciclo for each

Buenas compañero,

Me he descargado la librería y efectivamente no viene nada implementado para ello...
Así que te animo a usar antes del next ésta línea:
GC.Collect()

Además, de colocar todas las variables de esa ejecución del foreach a nothing, para que el recolector lo reconozca como espacio de memoria sin usar y lo libere. Aumentará algo el tiempo de ejecución, pero creo que merece la pena que tu aplicación no tome más recursos de los necesarios...


Un saludo compañero!!!
__________________
Rubén Espada
Desarrollador full stack .Net (Angular + JS + .Net Core)
  #7 (permalink)  
Antiguo 01/01/2017, 17:30
Avatar de Remy_Lebaut  
Fecha de Ingreso: junio-2013
Mensajes: 24
Antigüedad: 10 años, 10 meses
Puntos: 1
Respuesta: Problema de memoria con ciclo for each

Muchas gracias por tu respuesta Drako_18, he estado evaluando el problema y creo que la mejor solución sera no utilizar esta librería para este tipo de cosas...

Alguien sabe si esto que deseo hacer es posible realizar este ciclo con wmp.dll??
  #8 (permalink)  
Antiguo 02/01/2017, 14:52
Avatar de Drako_18  
Fecha de Ingreso: mayo-2005
Ubicación: Madrid
Mensajes: 505
Antigüedad: 18 años, 11 meses
Puntos: 16
Respuesta: Problema de memoria con ciclo for each

Buenas Remy_Lebaut,

No estoy seguro, pero creo que obteniendo un FileInfo podrías obtener estos datos...

Función GetFileInfo: https://msdn.microsoft.com/en-us/lib...v=vs.110).aspx
Clase FileInfo: https://msdn.microsoft.com/en-us/lib...v=vs.110).aspx
Propiedad Attributes: https://msdn.microsoft.com/en-us/lib...v=vs.110).aspx

Posiblemente con esto puedas acceder a las propiedades del archivo y así obtener el intérprete u otros datos guardados ahí (propiedades de un archivo mp3, detalles y ahí te aparece una lista).


Un saludo!!!
__________________
Rubén Espada
Desarrollador full stack .Net (Angular + JS + .Net Core)
  #9 (permalink)  
Antiguo 06/01/2017, 11:02
Avatar de Remy_Lebaut  
Fecha de Ingreso: junio-2013
Mensajes: 24
Antigüedad: 10 años, 10 meses
Puntos: 1
Respuesta: Problema de memoria con ciclo for each

Muchas gracias por tu respuesta, aunque no me fue bien con esa función, pero me encontré con una librería (TagLib-shap) por nuget y hasta ahora que podido sacar toda la info igual que en la otra librería, pero todavina no he intentado hacerlo en un for each, ya veré como me va con eso cuando regrese del trabajo!


Gracias

Etiquetas: directorio, memoria
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:17.