[VB .net] OutOfMemoryException con array e liste di immagini

domenica 11 novembre 2012 - 10.28
Tag Elenco Tags  VB.NET  |  .NET 4.0  |  Windows 7  |  Visual Studio Express

lorenzofailla Profilo | Newbie

Ciao a tutti.

come da oggetto, ottengo un'OutOfMemoryException quando cerco di caricare in una list una serie di immagini per successiva trasformazione in array e visualizzazione.
Le immagini sono prese da una DataTable precedentemente popolata con apposita Query
Il problema è che l'eccezione viene generata quando la routine che carica le immagini nella list viene eseguita la seconda volta. Nessuna eccezione viene generata alla prima esecuzione.
Ciò mi fa capire che la memoria è abbastanza per completare correttamente l'operazione, ma mi sto dimenticando di liberare risorse inutilizzate da qualche parte e alla seconda chiamata la memoria è effettivamente esaurita.

Solo che non riesco a capire dove, né come.

Ovviamente la DataTable è identica ogni volta (non più di 120 MB).
Altro indizio: se riduco la DataTable NON ottengo più l'eccezione, quindi credo che sia veramente un problema di memoria esaurita.

Sono ad un punto morto.
Ringrazio anticipatamente tutti gli utenti del forum, ed in maniera particolare chi volesse darmi un piccolo aiuto per risolvere il problema.

Di seguito il codice incriminato.

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Lorenzo

Fantazma Profilo | Junior Member

Ciao,
così a spanne, hai provato a spostare la riga

' riduco l'array a un array nullo myBytesBuffer = {}

dopo

' libero la risorsa myMemoryStream.Dispose()

Ipotizzo questo perchè con un datatable di grosse dimensioni la Garbage potrebbe avvenire prima che entri in azione la riga

' genero l'immagine dallo stream myTile.tile_image = System.Drawing.Image.FromStream(myMemoryStream)

dove myMemoryStream fa ovviamente riferimento a myBytesBuffer.

Ciao, Fabio

lorenzofailla Profilo | Newbie

Ciao Fabio,
grazie 1000 per la risposta.
Ho provato fare la modifica che hai proposto, ma ottengo lo stesso risultato...

Lorenzo.

lorenzofailla Profilo | Newbie

... però il tuo discorso sulla garbage e sulla tempistica con cui può intervenire mi ha illuminato!

ho effettivamente risolto così:
1. ho utilizzato una class al posto della structure, in questo modo prima di ogni chiamata ne dichiaro una "new", riscrivendoci di fatto sopra
2. invoco GC.Collect()

e non ottengo più l'OutOfMemoryException...

soluzione forse non troppo elegante ma l'imporante è che dia il risultato.

GRAZIE!.
Lorenzo.

Fantazma Profilo | Junior Member

Bene,
ero abbastanza convinto che fosse la Garbage...
Per l'eleganza... beh, le Structure non sono sempre la soluzione. avere un oggetto istanziabile ha i suoi vantaggi (costruttori e soprattutto puoi implementare tu una interfaccia IDisposable che sia più consona al tuo utilizzo).

Ciao!!!
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5