Memoire insuffisante

leraleursympa Messages postés 25 Date d'inscription samedi 4 avril 2015 Statut Membre Dernière intervention 24 juin 2015 - 19 juin 2015 à 15:08
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 24 juin 2015 à 17:53
Bonjour
j'ai un pc 6 gigaoctets de mémoire
je programme en vba excel
je crée des variables tableau avec redim preserve en augmentant la taille en fonction des besoins par 100 megaoctets
(grands tableaux)
lorsque la somme de mes variables atteint environ 900 megaoctets.... j'ai une erreur 7 (mémoire insuffisante)
exemple pour mieux expliquer:



sub un
Dim rien1() As Double

Dim rien2() As Double

Dim rien3() As Double

Dim rien4() As Double

Dim rien5() As Double

Dim rien6() As Double


On Error GoTo LErreur
l = 2000000
c = 10
ReDim rien1(l, c)
ReDim rien2(l, c)
ReDim rien3(l, c)
ReDim rien4(l, c)
ReDim rien5(l, c)
ReDim rien6(l, c)

rienl = rienl
For rienl = 1 To l
For rienc = 1 To c
rien1(rienl, rienc) = rienc + 1000 * rienl
rien2(rienl, rienc) = rienc + 1000 * rienl
rien3(rienl, rienc) = rienc + 1000 * rienl
rien4(rienl, rienc) = rienc + 1000 * rienl
rien5(rienl, rienc) = rienc + 1000 * rienl
rien6(rienl, rienc) = rienc + 1000 * rienl
Next rienc
Next rienl

Exit Sub
LErreur:
rienl = rienl
Resume Next
End Sub


si on donne à l la valeur 1900000 il y a erreur 7
si on donne à l la valeur 1800000 : pas d'erreur.
10*1900000*8*6= 912000000 = 912 millions

c * l * 8octets (pour 1 Double)* 6 tableaux= environ 912 méga octets libres.
donne mémoire insuffisante, alors qu'il reste encore plus de 3 giga octets libres.

dans une fenetre microsoft visual basic:
"erreur d'exécution 7 : mémoire insuffisante

et dans
Présentation de l'analyseur de performance :
mémoire :
défaut de cache 0.000
mégaoctets disponibles : 3328,000
pourcentages d'octets dédiés utilisés :24,867

je n'ai aucun tableau dépassant 2 giga octets
je ne comprends pas pourquoi cette erreur
et surtout comment y remedier.

j'ai lu : https://support.microsoft.com/en-us/kb/978610/fr

j'ai :Windows 7 édition familiale premium
service pack 1
dans système:
indice de performance Windows :5.8
processeur i7
Mémoire installée 'RAM) : 6.00 Go
(l'utilisable n'est pas indiquée, c'est pour cela que j'ai utilisé l'Analyseur de performance :)
type de Système: Système d'exploitation 64 bits
(et donc la limite est de 16 Go pour Windows 7 édition familiale premium, d'après l'article)

Présentation de l'analyseur de performance :

mémoire :
mégaoctets disponibles : 3328,000 (3,3 Go) au moment du plantage, mais 4.3 Go environ au début du programme
(ce qui correspond bien AU 0.9 Go )

mon vrai programme fonctionne parfaitement, mon seul probleme est ce probleme de mémoire!!!

mon vrai programme utilise des dictionnaires donc obligatoirement en memoire virtuel
utilisés pour éviter les doublons et recherche ultra rapide.
des tableaux sur disque sont bien trop lents (meme en RAM qui de toute façon pose le meme probleme)
un fichier random est bien trop lent (j'ai essayé) , même une recherche dans un tableau en ram (qui de toute façon pose le même problème de ram) est trop lent..., seul les dictionnaires sont assez rapide.
je pourrais couper les dictionnaires en bouts que je mettrai sur disque (par sauvegarde de 2 fichiers, 1 pour les Keys,1 pour les Items) mais cela pose un problème de rapidité pour éliminer les doublons présents dans les différents bouts de dictionnaires, et de rapidité de recherche, alors que avec 1 seul dictionnaire en mémoire c'est par construction du dictionnaire si facilement résolu et d'une vitesse incroyable ....
d'où ma recherche ... désespérée !!

Comme me l'a gentiment conseillé Pijaku, j'ai regardé ce post: http://codes-sources.commentcamarche.net/forum/oldest/10019292-vba-excel-recursivite-jeu-du-boggle?page=2#114
Mais ne suis ps sur que cela réponde à mon besoin
Et je vois mal comment l'adapter.

Ps : cette question fait suite à celle-ci : http://www.commentcamarche.net/forum/affich-32126823-memoire-insuffisante#p32132986

Merci d'avance pour m'éclairer.
Cordialement

11 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 237
19 juin 2015 à 18:01
Bonjour,
Je m'étais déjà "creusé le cerveau" sur ce sujet alors que tu avais ouvert une discussion sous le pseudo ClaudeDordogne.
En vain avec Excel et son VBA seuls. Excel a ses propres limites de stockage.
Tu peux tenter l'utilisation d'une véritable base de données, mais, même ainsi, il te faudra faire harakiri de l'importation de la totalité des enregistrements dans un recordset. Elle ne sera exploitable qu'à l'aide de requêtes filtrant (et donc en réduisant le nombre) les articles à "importer" dans un jeu d'enregistrement (recordset).
1
pijaku Messages postés 12259 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 9 août 2022 14
20 juin 2015 à 07:37
Bonjour,
Je passe juste pour rebondir sur : Excel a ses propres limites de stockage.
Il s'avère que ce n'est pas adaptable ici car Leraleur dispose de 2007, mais, c'est toujours bon à savoir...
http://blogs.technet.com/b/backstage_2010/archive/2009/07/14/en-direct-de-la-wpc-jour-2-excel-2010-fait-son-show.aspx
Après il est vrai que cela reste Excel et qu'on en connait les limites...
Bon week end à tous.
0