Erreur d'execution '7' : Mémoire insuffisante

Erreur d'execution '7' : Mémoire insuffisante - VB/VBA/VBS - Programmation

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 :
 

Citation :

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.
 

Reply

Marsh Posté le 22-05-2006 à 14:11:56   

Reply

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 ;)

Reply

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.


Message édité par fifiz le 22-05-2006 à 19:46:13
Reply

Marsh Posté le 22-05-2006 à 20:33:52    

c'est encore pire :o
 
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 !


Message édité par Arjuna le 22-05-2006 à 20:34:30
Reply

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 ?


Message édité par kiki29 le 23-05-2006 à 00:53:54
Reply

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.


Message édité par fifiz le 23-05-2006 à 01:50:14
Reply

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é


Message édité par kiki29 le 23-05-2006 à 03:49:24
Reply

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 ?

Reply

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 !

Reply

Marsh Posté le 23-05-2006 à 11:48:43    

Et t'en fait quoi des lignes pas pareiles ?

Reply

Marsh Posté le 23-05-2006 à 11:48:43   

Reply

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

Reply

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.


Message édité par fifiz le 02-06-2006 à 17:26:10
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed