A voir également:
- La mémoire disponible est insuffisante pour finir cette action excel
- Action - Guide
- Cette personne n'est pas disponible sur messenger - Guide
- Télécharger film d'action gratuitement et rapidement - Télécharger - TV & Vidéo
- Liste déroulante excel - Guide
- Word et excel gratuit - Guide
11 réponses
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
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
Bonjour
En déclarant les données en LONG, ne serait-ce pas suffisant?
Max=2 147 483 647
Cdlt
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
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 :
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.
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.
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.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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.
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.
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
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
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.
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.
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..... :(
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..... :(
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
puisque c'est lui qui a donner ses précieux conseils dans ce post
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
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
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!
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!
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