Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1676 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1372141
fifiz
Posté le 22-05-2006 à 14:11:56  profilanswer
 

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.
 

mood
Publicité
Posté le 22-05-2006 à 14:11:56  profilanswer
 

n°1372154
Arjuna
Aircraft Ident.: F-MBSD
Posté le 22-05-2006 à 14:26:17  profilanswer
 

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

n°1372495
fifiz
Posté le 22-05-2006 à 19:44:38  profilanswer
 

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
n°1372520
Arjuna
Aircraft Ident.: F-MBSD
Posté le 22-05-2006 à 20:33:52  profilanswer
 

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
n°1372633
kiki29
Posté le 22-05-2006 à 22:25:52  profilanswer
 

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
n°1372762
fifiz
Posté le 23-05-2006 à 01:49:44  profilanswer
 

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
n°1372773
kiki29
Posté le 23-05-2006 à 03:46:49  profilanswer
 

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
n°1372819
Arjuna
Aircraft Ident.: F-MBSD
Posté le 23-05-2006 à 09:39:50  profilanswer
 

fifiz > je ne vois pas pkoi tu ne compare pas simplement ligne à ligne...
 
il faut quoi au juste ton soft ?

n°1372978
fifiz
Posté le 23-05-2006 à 11:42:18  profilanswer
 

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 !

n°1372994
Arjuna
Aircraft Ident.: F-MBSD
Posté le 23-05-2006 à 11:48:43  profilanswer
 

Et t'en fait quoi des lignes pas pareiles ?

mood
Publicité
Posté le 23-05-2006 à 11:48:43  profilanswer
 

n°1372999
Arjuna
Aircraft Ident.: F-MBSD
Posté le 23-05-2006 à 11:50:27  profilanswer
 

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

n°1380095
fifiz
Posté le 02-06-2006 à 17:24:52  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

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

 

Sujets relatifs
ejb+jboss+erreur de contextcomparaison de fichiers textes avec des tableaux en mémoire.
Une erreur de débutantErreur d'exécution de perl
GROS PROBLEME sous VBA word...Memoire insuffisante?API Windows, pointeurs/handles et mémoire locked/unlocked
XML - suppresion de noeuds dynamiquement [erreur]php / mysql erreur enregistrement
Plus de sujets relatifs à : Erreur d'execution '7' : Mémoire insuffisante


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR