Newsgroup: it.comp.lang.visual-basic
Titolo: Variabili immortali?!?!?!?!

Mi sono imbattuto in un errore "OUT OF MEMORY" che non riesco a
spiegarmi....
Ho fatto un programma che, ad intervalli regolari, scarica svariati blocchi
di dati da un server per depositarli su un DB. Ovviamente per fare questo
passaggio i dati vengono temporaneamente depositati su dei vettori che
possono raggiungere delle dimensioni abbastanza voluminose: ho dunque fatto
in modo che tutti questi vettori fossero definiti a livello locale,
all'interno, cioè delle funzioni che li usano, in modo tale che il loro
tempo di vita sia strettamente legato al tempo di esecuzione della funzione.
L'unica variabile globale di dimensioni generose (ma neanche poi tanto!) è
una matrice in cui memorizzo l'elenco (e non il contenuto!) dei blocchi
scaricati con successo; maquesta matrice viene reinizializzata ad ogni
intervallo tramite il comando ReDim, e dunque, se ho studiato bene, dovrebbe
venirne liberata la memoria che le era stata allocata per assegnargliene una
nuova porzione. Allora perchè se scarico pochi blocchi tutto va bene e se ne
scarico parecchi mi imbatto in un "OUT OF MEMORY"?!?!?!? Questo mi fa
pensare che in realtà VB non liberi correttamente la memoria quando una
variabile termina il suo "tempo di vita" oppure tramite l'istruzione ReDim!
Oppure io non ho capito bene qualche cosa (il che mi sembra infinitamente
più probabile!!!):
Grazie e ciao
--------------------------------
Inviato via 
http://usenet.libero.it

 variabile termina il suo "tempo di vita" oppure tramite l'istruzione
ReDim!
Prima di eseguire REDIM, prova a eseguire ERASE nomearray
O meglio, esegui ERASE non appena i dati dell'array non ti servono più.
Se anche così dovessi avere problemi, prova a indicare la struttura esatta
degli array e le sue dimensioni.
termoPilucco.

 degli array e le sue dimensioni.
OK, tenterň, grazie.
PS: splendido nome!!!


 degli array e le sue dimensioni.
Prima di lanciarmi in ulteriori modifiche ti chiedo un'altro paio di
delucidazione:
1) sono sicuro che nel momento dell'uscita da una funzione lo spazio
allocato per le variabili dichiarate al suo interno venga liberato, o è
meglio fare un bel ERASE anche qui?
2) ci possono essere dei preoblemi ci disponibilità di risorse anche durante
la scrittura su un file dui testo un po' grande? Mi spiego meglio: dei
blocchi di dati che scarico, ne deposito una copia anche su un file di testo
(tramite un Append), e non vorrei che quando le dimensioni crescono un po'
troppo la scrittura mi pianti tutto.
Grazie.


 troppo la scrittura mi pianti tutto.
I file non occupano in RAM l'intero spazio che occupano su disco (anche se
vengono registrati, almeno in parte, nella cache del filesystem).
Potrebbe essere utile se postassi le implementazioni dei punti chiave della
tua procedura.
termoPilucco.

 tua procedura.
E' tutto molto banale: acquisisc i dati tramite la funzione GetChuck
(routine copiata pari pari dalla MSDN!), che piazza tutto su una stringa.
Poi tramite split in successione popolo una matrice che poi riporto sulla
tabella tramite un ciclo For che analizza tutte le celle della matrica.
Forse l'unico problema è che popolata la matrice, per analizzarne una riga,
la copio su un vettore, che passo per riferimento ad una funzione che fa
alcune operazioni su qesti dati. Però, un passaggio per riferimento non
dovrebbe creare problemi... Tra queste operazioni c'è anche la scrittura sul
file di testo che avviene tramite un print in Append.
