Newsgroup: it.comp.lang.visual-basic
Titolo: Allocazione memoria in VB (Dim, Redim)

Salve a tutti,
 vorrei avere qualche delucidazione sull'allocazione di memoria in VB.
Mi spiego: ho un programmino che dimensiona una matrice X un certo
tipo, ad es:
Dim X(10000) as Long
.
e poi, ogni volta che premo un tasto, mi "ingrandisce" la matrice:
.
Redim Preserve X(Ubound(X)+10000)
.
e alla fine del programma:
.
Erase(X)
Quello che ho notato, guardando anche il monitor di risorse di
Windows, e' che tutto va bene finche' la "memoria allocata" non
raggiunge il limite di memoria fisicamente disponibile nel sistema
(256MB), poi compare l'ovvio errore che segnala che non c'e' piu'
memoria nel sistema.
Il fatto e' che, quando lancio il mio programma (l'eseguibile, quindi
non da ambiente VB), gia' trovo che Windows si e' preso poco piu' di
200MB pur non essendoci altri programmi attivi.
Insomma non riesco ad allocare piu' di una cinquantina di MB.
Compra piu' RAM direte voi.....
Pero' poi ho notato che facendo un analogo programmino in C, (usando
alloc e realloc):
X=(long*)malloc(10000*sizeof(long));
dimX=10000;
.
.
X=(long*)realloc(X,dimX+10000*sizeof(long));
dimX+=10000;
.
free(X);
.
la memoria allocata va anche ben oltre i 200MB. E vedo che,
ovviamente, inizia a crescere la memoria su swap.Non so se il sistema
manda su swap altre cose e riserva memoria RAM per il mio programmino,
oppure mette direttametnte le mie risorse su swap. Ma questo mi
interessa poco: l'importante e' che riesca ad allocare quanto
richiesto.
Ora mi domando: si puo' fare in modo che in VB accada piu' o meno la
stessa cosa ?
Sotto al Redim non c'e' un realloc ?
Perche' il sistema si comporta in modo diverso ?
Grazie a chiunque sappia darmi info.

 Grazie a chiunque sappia darmi info.
Se cerchi nell'help di vb vedi Microsoft sconsiglia di usare array di
grandi dimensioni o a piu Dimensioni.
Penso che sia non un Bug ma qualcosa di vicino.
Purtroppo vb non è C e non gestisce bene la memoria in questo caso.
Ciao.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Purtroppo vb non è C e non gestisce bene la memoria in questo caso.
Sara', ma i "grandi" a cui si riferiscono non sono certo in questo ordine...
a meno di essersi dimenticato qualche zero, stiamo parlando di
10.000 elementi * 4 byte l'uno (il tipo Long)
ovvero meno di 40 Kb; se arriva ad occupare 200 Mb in avvio, temo che il
problema sia altrove..
Ciao
--
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

 Purtroppo vb non è C e non gestisce bene la memoria in questo caso.
Qualche info in tal senso, sempre per favore.

 Qualche info in tal senso, sempre per favore.
Qualcosa la si trova seguendo questo thread.
http://makeashorterlink.com/?Z237125B3
Ciao

 richiesto.
purtroppo ho constatato che come dici tu vb gestisce la memoria in modo
orrendo, comuque dalle prove che ho fatto winxp sp1 e vb6sp5, ho allocato
l'array e sono arrivato intorno ai 140.000.000 di long che sono più di
534mega poi scoppia dicendo memoria esaurita nonostante all'avvio del
progetto c'erano occupati più di 200mega di ram, quindi windows va in swap
ma fino alla capienza fisica di ram e diciamo che è quasi ragionevole in
quanto usi un array che teoricamente è della memoria contigua a cui potresti
accedere anche sequenzialmente o casualmente.
Superati comunque i 100.000.000 la macchina è iniziata a piangere poichè il
disco frullava alla grande, con mia grande sorpresa invece ho fatto la
stessa cosa in c usando il vc  c++ e allocando non 140.000.000 ma bensi
210.000.000 che è superiore sia alla ram fisica 512 che al file di swap
impostato a 766mb e con il codice qui sotto non ha dato nessun problema
unsigned long *X;
X=(unsigned long*)malloc(10000*sizeof(long));
unsigned long dimX=210000000;
X=(unsigned long*)realloc(X,dimX * sizeof(long));
for (unsigned long i=0; i<dimX; i++)
{
X[i]=i;
}
il bello del C è che finchè non inizializzi l'array lui non ti alloca
niente, infatti senza il ciclo for non occupa memoria (che bravo bambino)
conclusioni di questo post senza senso è che se hai una macchina con 256mb
di ram l'array fino a 256 ci deve arrivare

Grazie a tutti,
 effettivamente pare che il VB gestisca maluccio la memoria.
Tra le varie cose, pare col Preserve il VB faccia prima una nuova
matrice delle dimensioni volute, poi ci copia dentro i vecchi valori
e, solo alla fine di tutto cio' rilascia la emmoria della "vecchia"
matrice.
Il che vuol dire che se ho una matrice di 1000byte e voglio portarla a
1500byte, mi occorrono 2500byte di memoria....
 Se a questo si aggiunge che non riesce ad allocare le stesse
quantita' di memoria che alloca il C ecco che mi tornano i conti...
Arigrazie.

niente, infatti senza il ciclo for non occupa memoria (che bravo bambino)
Non per andare OFF-TOPIC, ma ne sei sicuro ?
Non credo sia come dici. Credo che con alloc / realloc gia' ti riservi
memoria.
 


certezze non ne ho.....però dalla prova che ho fatto se non faccio il ciclo
for per l'assegnamento dell'array di memoria occupata non ne vedo, mentre se
metto il ciclo la memoria inizia a diminuire e poi inizia lo swap