Erreur d'execution '7' : Mémoire insuffisante - VB/VBA/VBS - Programmation
Marsh Posté le 22-05-2006 à 14:26:17
essaie de charger tes fichiers textes par petits morceaux.
à mon avis, tu dois tenter d'ouvrir les 40 Mo dans une seule string en VBA et... c'est un type qui a beau accepter des gros pavés, faut pas pousser mémé dans les orties non plus
Marsh Posté le 22-05-2006 à 19:44:38
Bonsoir,
Les 40 mo de fichiers ne sont pas récupérés dans un unique string ...
Le contenu est inséré ligne par ligne dans un tableau déclaré comme-ci :
Global ListeLigneOrigine As ListeLigne
Type ListeLigne
Ligne() As String
Flag() As String
Nombre As Long
End Type
Tableau mis a jour avec le code suivant :
FileSourceOrigine = 'mon nom de fichier'
Open FileSourceOrigine For Input Access Read As #1
While (Not EOF(1))
Line Input #1, Chaine
If Chaine <> "" Then
ListeLigneOrigine.Nombre = ListeLigneOrigine.Nombre + 1
ReDim Preserve ListeLigneOrigine.Ligne(1 To ListeLigneOrigine.Nombre)
ReDim Preserve ListeLigneOrigine.Flag(1 To ListeLigneOrigine.Nombre)
ListeLigneOrigine.Ligne(ListeLigneOrigine.Nombre) = Chaine
ListeLigneOrigine.Flag(ListeLigneOrigine.Nombre) = ""
MaxLigneOrigine = ListeLigneOrigine.Nombre
End If
Wend
Close #1
Ca plante en cours de chargement avant même que je n'accede aux données du tableau.
Je ne peux pas découper car j'ai besoin de toutes les infos en même temps sinon le traitement n'a plus d'intérêts.
En conclusion je ne pense pas que ce soit un problème de code.
Quelqu'un aurait il une idée ?
Merci d'avance.
Marsh Posté le 22-05-2006 à 20:33:52
c'est encore pire
tu charges dans un tableau > idem qu'une grosse string
tu fais des redim preserve
=> c'est HORRIBLE d'un point de vue perfs et d'un point de vue occupation mémoire
ne passe pas par un tableau, quite à relire 25 fois le même fichier !
Marsh Posté le 22-05-2006 à 22:25:52
Par curiosité j'ai créé un fichier texte bidon de 45Mo et 946540 lignes
avec Redim Preserve dans la boucle : 103s avec redim hors boucle 32s
et pas d'erreur.
Même manip avec 98Mo et 2004139 lignes en 70s et pas d'erreur
Gestion Dynamique ou Statique du Swap ?
Marsh Posté le 23-05-2006 à 01:49:44
Pour kiki29 : pour la gestion de swap je regarde demain sur la bécane que j'utilisais quand ca a planté mais ça m'arrangerais pas vraiment que ca puisse varier d'un ordi à l'autre.
Qu''entends tu par "redim hors boucle ?" j'avais pas bien compris ton message dans l'autre post en fait =)
Si tu peux coller les codes utilisés dans tes tests ca me ferait des bon exemples =)
Pour Arjuna : en fait c'est une comparaison de deux fichiers qui peuvent faire plusieurs centaines de milliers de lignes donc je me vois mal relire le fichier 100000 fois =/
Merci à tous deux pour vos remarques et désolé pour ma méconnaissance du langage mais j'ai un peu appris sur le tas.
Marsh Posté le 23-05-2006 à 03:46:49
Dans tes exemples précédents tu comptais il me semble le nb de lignes de tes fichiers donc
While (Not EOF(1))
....
ReDim Preserve ListeLigneOrigine.Ligne(1 To ListeLigneOrigine.Nombre)
ReDim Preserve ListeLigneOrigine.Flag(1 To ListeLigneOrigine.Nombre)
...
Wend
devenant qqch comme cela
ReDim ListeLigneOrigine.Ligne(ListeLigneOrigine.Nombre)
ReDim ListeLigneOrigine.Flag(ListeLigneOrigine.Nombre)
While (Not EOF(1))
....
...
Wend
Désolé mais je n'ai pas gardé de trace du code utilisé
Marsh Posté le 23-05-2006 à 09:39:50
fifiz > je ne vois pas pkoi tu ne compare pas simplement ligne à ligne...
il faut quoi au juste ton soft ?
Marsh Posté le 23-05-2006 à 11:42:18
Carac de la bécane :
Proc:3,6Gh
RAM:1Go
Swap:1536/3072Mo
la macro identifie toutes les lignes
qui sont dans le premier fichier et pas dans le second
ainsi que les lignes
qui sont dans le second fichier et pas dans le premier.
voir post : http://forum.hardware.fr/hardwaref [...] 0725-1.htm
Enfin, vous aviez raison, sans le ReDim Preserve c'est pas plus rapide mais ça plante plus =)
Donc merci de votre aide et pour la partie optimisation je vais essayer de me débrouiller !
Marsh Posté le 23-05-2006 à 11:50:27
PS: un autre souci. si par exemple tu affiches dans ta feuille les lignes pas pareil...
sâche qu'une feuille excel est limitée à 65000 lignes et des bananes. c'est mal si tu as deux fichiers de grande taille complètement différents
Marsh Posté le 02-06-2006 à 17:24:52
Les fichiers sont de tres grandes tailles mais le nombre de différence n'excede en général pas quelques milliers de lignes.
Je dump directement les différences dans des fichiers textes "a charger" et "a supprimer" qui sont vérifiés/modifiés ensuite manuellement.
Cette méthode me permet de faire des patchs pour remonter les paramétrages d'une appli (recette ou préproduction) a une autre (production) en étant certain de ne rien oublier.
Marsh Posté le 22-05-2006 à 14:11:56
Bonjour,
J'ai une macro dans un fichier excel qui charge des fichiers textes pour effectuer des traitements et les réécrire.
Sur des tres grros fichiers plus de 220000 lignse (à peu pres 40 mo de fichier), j'ai le message suivant :
Erreur d'execution '7' :
Mémoire insuffisante
S'agit il d'une limitation d'excel ? ou de ma machine ? dans les deux cas existe t'il un paramétrage permettant d'augmenter la mémoire allouable ?
Merci d'avance.