Memoire insuffisante

Fermé
leraleursympa Messages postés 25 Date d'inscription samedi 4 avril 2015 Statut Membre Dernière intervention 24 juin 2015 - 17 juin 2015 à 23:35
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 - 20 juin 2015 à 19:07
bonsoir,https://forums.commentcamarche.net/forum/new
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 atteinds environ 600 à 700 megaoctets.... j'ai une erreur 7 (mémoire insuffisante)
exemple pour mieux expliquer:



sub un
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
A voir également:

11 réponses

leraleursympa Messages postés 25 Date d'inscription samedi 4 avril 2015 Statut Membre Dernière intervention 24 juin 2015
18 juin 2015 à 00:18
suite....
si on donne à l la valeur 1900000 il y a erreur 7
si on donne à l la valeur 1800000 : pas d'erreur.
10*1900000*4*6= 456000000 = 456 millions
c * l * 4octets (pour 1 Double)* 6 tableaux= environ 456 méga octets libres.
donne mémoire insuffisante, alors qu'il reste encore plus de 3 giga octets libres. (voir pour connaitre la mémoire restante.jpg en piece jointe)
je n'ai aucun tableau dépassant 2 giga octets
je ne comprends pas pourquoi cette erreur
et surtout comment y remedier.
mon vrai programme necessite de grands tableaux en memoire virtuel du fait d'un appel frequent aux données, qui doit etre rapide et donc sur disque c'est trop lent
Merci d'avance pour m'éclairer.
Cordialement
0
leraleursympa Messages postés 25 Date d'inscription samedi 4 avril 2015 Statut Membre Dernière intervention 24 juin 2015
18 juin 2015 à 00:25
bon, je ne sais pas comment joindre un fichier .jpg
voila ce que j'ai sur ce fichier:
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
0
Frenchie83 Messages postés 2240 Date d'inscription lundi 6 mai 2013 Statut Membre Dernière intervention 11 août 2023 337
18 juin 2015 à 07:41
Bonjour
En déclarant les données en LONG, ne serait-ce pas suffisant?
ReDim rien1(l, c) As Long
ReDim rien2(l, c) As Long
ReDim rien3(l, c) As Long
ReDim rien4(l, c) As Long
ReDim rien5(l, c) As Long
ReDim rien6(l, c) As Long


Max=2 147 483 647
Cdlt
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 745
18 juin 2015 à 08:03
Bonjour,

En tout premier lieu, il me semble qu'un Double est codé sur 8 octets :
Type de données stockant sur 64 bits les nombres à virgule flottante en double précision
1 octet = 8 bits, 64 bits => 8 octets.
Pour le coup, ton code ci-dessus, représenterai :
2 000 000 x 10 x 8 x 6 = 960 000 000. Soit 0,96 Go.

En second lieu, il faut savoir deux choses :
1- Un ordinateur équipé de 6Go de Ram n'utilise jamais la totalité de cette mémoire. à lire.
2- Excel est limité en quantité de mémoire allouée par Windows. Pour les versions 32 bits d'Excel, il me semble que le max de mémoire allouée est de 2Go.

Et enfin, tu n'as pas déclaré tes variables rien1, rien2, rien3...rien5. Donc ce sont des ... variant. Soit 16 Octets.
Reprenons ton calcul :
(2 000 000 x 10 x 16 x 5) + (2 000 000 x 10 x 8) = 1,760 Go.

Donc, déclarer ET typer tes variables en Double, te permettra certainement d'aller plus loin.
Essaye ceci :
Sub un()
Dim rien6() As Double, rien1() As Double, rien2() As Double, rien3() As Double, rien4() As Double, rien5() 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


Mais...
De toutes manières, VBA n'est pas conçu pour le traitement de millions de données. Il faudrait en savoir davantage sur ce que tu souhaites pour pouvoir t'aider.
0
leraleursympa Messages postés 25 Date d'inscription samedi 4 avril 2015 Statut Membre Dernière intervention 24 juin 2015
18 juin 2015 à 22:10
bonsoir,
tout d'abord merci pour les réponses
j'avais bien déclarer en Double, j'ai oublié de réécrire cette partie.

effectivement Double est sur 8 octets donc 0.96 giga.

j'ai lu : https://support.microsoft.com/en-us/help/978610/the-usable-memory-may-be-less-than-the-installed-memory-on-windows-7-b

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 à tes 0.96 Go :) )

quand à mon programme, en fait je crée un dictionnaire avec pour chaque élément une variable correspondant à un type que j'ai défini (comprenant chaines de caractères (ex string*55), et nombres (doubles, long, integer ...)
le Len de ce type est de 1000 octets environ(vérifier par le débogueur)

comme j'en ai 1 dictionnaire d'environ 1 500 000 éléments cela fait environ 1.5 Go. ... et cela ne passe pas.
si j'utilise des dictionnaires, c'est pour un tri ultra rapide et supprimer les doublons presque instantanément.
et comme les dictionnaires ne peuvent pas être traités sur disque...
d'où mon problème....
si j'utilise vba excel, c'est que c'est le seul langage que je maitrise.
à part ce problème de mémoire, le programme tourne très vite et bien.

le petit programme exemple est fait pour expliquer le plus clairement où cela coince, sans vrai rapport avec les dicos
voilà.
je n'ai toujours pas compris pourquoi cette limite de moins que 1 Go...

merci pour votre aide.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 745
19 juin 2015 à 07:28
Bonjour leraleursympa,

je n'ai toujours pas compris pourquoi cette limite de moins que 1 Go...
Je te rassure, personne ne la comprends. Je suis allé me rencardé sur Internet, y compris sur les sites anglophones, et il n'y a rien, ou pas grand chose, sur cette limitation de mémoire. Ce que je penses c'est qu'Excel et Windows brident l'utilisation de la RAM.
On part donc du principe que, comme dit précédemment, VBA n'est pas conçu pour le traitement de millions de données.

Comment faire dans un tel cas?
Personnellement, je te recommande d'utiliser un bête fichier texte pour y stocker tes données. Il te suffira alors de n'importer que celles utiles pour la partie du programme en cours.

Pour t'aider davantage, cela risque d'être compliqué sans fichier et sans tes données. Mon second conseil sera donc le suivant :
- pose clairement ton souci,
- établit clairement une méthodologie,
- repose ta question, une fois les problèmes isolés, sur ce forum, spécialisé dans les problèmes de développement sous VBA.
0
leraleursympa Messages postés 25 Date d'inscription samedi 4 avril 2015 Statut Membre Dernière intervention 24 juin 2015
19 juin 2015 à 10:43
Merci :)
comme je dois avoir une base de donnée de 1 500 000 éléments sans doublons, et que après avoir créé un nouvel élément, je dois rechercher si il y en a un dans la base de données qui lui correspond afin de le traiter.

un fichier texte sur disque ne convient pas, 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 !!

autre chose
tu me proposes de poser la question sur le forum vba spécialisé.
afin d'éviter un doublon dans les forum, je voudrais y transférer cette question, comme cela se sera plus propre pour les forums et plus clair pour ceux qui auront la gentillesse de me répondre
cependant je ne sais pas comment faire....
amicalement
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 745
19 juin 2015 à 11:50
De rien ;-)

un fichier texte sur disque ne convient pas, un fichier random est bien trop lent (j'ai essayé)
Je ne suis pas aussi affirmatif que toi.
En ce qui concerne la recherche :
Une requête sur un fichier txt est extrêmement rapide.
Lors de la création d'un jeu sur Excel, j'ai eu l'occasion d'échanger à ce sujet, et un des aspects que l'on a creusé était justement ce type d'utilisation. Regarde ce post en particulier : https://codes-sources.commentcamarche.net/forum/oldest/10019292-vba-excel-recursivite-jeu-du-boggle?page=2#114

En ce qui concerne l'écriture dans un fichier txt
Si c'est juste pour remplacer et/ou ajouter une données, c'est quasiment immédiat.

Par contre, pour ces deux aspects, (recherche et écriture), il te faut préalablement avoir bien structuré ton fichier txt. C'est là ou tu atteins la limite de mon incompétence, car je n'y connais absolument rien...
D'où ma suggestion d'ouvrir un nouveau sujet sur CodeS-SourceS.
Pour faire le lien avec ici, commence simplement ta question par :
Bonjour,
Par suite d'une question posée sur CCM (ici : insère le lien vers ce sujet), il m'a été vivement conseillé de faire appel à vos lumières. Voici mon problème :
bla bla bla

Je vais suivre avec intérêt ta discussion là-bas.
0
leraleursympa Messages postés 25 Date d'inscription samedi 4 avril 2015 Statut Membre Dernière intervention 24 juin 2015
19 juin 2015 à 12:33
Merci :)
j'ai regardé ce post
j'y ai retrouvé ucfoutu qui m'a gentiment expliqué les dictionnaires et leurs rapidités.
je vais étudier cela
puis je transfère ma question sur le forum vba

j'ai testé mon prog sur un ordi à 2 Go = identique à celui à 6 Go..... :(
0
leraleursympa Messages postés 25 Date d'inscription samedi 4 avril 2015 Statut Membre Dernière intervention 24 juin 2015
19 juin 2015 à 12:46
j'en ai profité pour envoyer un mot à Ucfoutu au sujet de cela
puisque c'est lui qui a donner ses précieux conseils dans ce post
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 745
19 juin 2015 à 12:56
Il est toutefois préférable de créer un nouveau sujet. L'aide sur les forums de discussions ne se fait pas en messages privés.
Et ne t'inquiète pas, si tu créées un sujet sur Codes sources, il le verra...
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 215
Modifié par eriiic le 19/06/2015 à 20:08
Bonjour,

Tu pourrais jeter un oeil à PowerPivot qui est un addin pour traiter les grandes bases.
https://docs.microsoft.com/fr-fr/sharepoint/sharepoint-server?redirectedfrom=MSDN

Pas trouvé mais il y a sans doute moyen de traiter les doublons dedans, c'est quand même une opération classique dans les BDD.

J'avais vu une vidéo de présentation à l'époque, vraiment très impressionnant.
Je n'avais pas été au-delà de quelques tests de découverte, je ne pourrais pas t'aider.

Pas vu ta version excel... De mémoire sur 2013 tu l'as ou pas selon la version mais tu ne peux pas l'ajouter. Sur 2010 pas de soucis.

eric
En essayant continuellement, on finit par réussir.
Donc plus ça rate, plus on a de chances que ça marche.(les Shadoks)
En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
0
leraleursympa Messages postés 25 Date d'inscription samedi 4 avril 2015 Statut Membre Dernière intervention 24 juin 2015
19 juin 2015 à 21:37
bonsoir,
eriiic : j'ai excel 2007

pijaku : j'ai suivi ton conseil, et ai mis une discution sur le forum, spécialisé dans les problèmes de développement sous VBA.
j'ai juste écrit à Ucfoutu que j'ai "encore " besoin de ses lumieres et qu'il ait la gentillesse de regarder cette discution :)
merci à tous les 2
LeRaleur... mais Sympa!
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 215
20 juin 2015 à 00:13
dommage...
0
leraleursympa Messages postés 25 Date d'inscription samedi 4 avril 2015 Statut Membre Dernière intervention 24 juin 2015
20 juin 2015 à 15:05
salut eriiic
merci de me préciser pourquoi dommage?
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 215
20 juin 2015 à 19:07
Parce que ...
Version d'Excel : Excel 2010 (32 bits ou 64 bits) est requis pour installer PowerPivot pour Excel.
Sur 2007 tu ne peux que consulter.
eric
0