IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Comment libérer de la mémoire ?


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Août 2007
    Messages : 36
    Points : 51
    Points
    51
    Par défaut Comment libérer de la mémoire ?
    Bonjour,

    J'interviens en maintenance sur une application de plusieurs miliers de lignes en VBA Excel qui fait des traitements sur de grosses feuilles de données.
    Certaines instructions à répétition ont tendance à occuper de la mémoire sans la libérer (je le vois en regardant l'uilisation de la mémoire avec le gestionnaire des tâches de Windows). Typiquement il s'agit d'instructions d'insertions ou de suppression de lignes, ou alors des requêtes sql qui peuvent charger la mémoire de 10Mo d'un coup lors du Refresh.
    Evidemment, plus la mémoire est occupée, plus le traitement est ralenti

    Ma question : comment libérer de la mémoire réservée par Excel lors de l'exécution de ce code ?

    Merci

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Réponse classique : Variables déclarées (option explicit), favoriser les variables locales plutôt que publiques, supprimer les instances quand elles ne sont plus utilisées (set linstance = Nothing), utiliser "Application.screenupdating = False" ainsi que "Worksheets(1).EnableCalculation = False" le plus souvent possible... (propriétés qu'il suffit de passer à True pour les rétablir)... etc
    Pas d'autre idée pour l'instant

  3. #3
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Août 2007
    Messages : 36
    Points : 51
    Points
    51
    Par défaut
    Merci de ta réponse.

    • Variables déclarées (option explicit), => c'est déjà le cas
    • favoriser les variables locales plutôt que publiques => c'est déjà le cas et il n'y a pas de variable globale volumineuse
    • supprimer les instances quand elles ne sont plus utilisées (set linstance = Nothing) => je vais chercher dans ce sens
    • utiliser "Application.screenupdating = False" => sans impact. Pour exemple, rien qu'en remplaçant dans une boucle les insert et delete de lignes par des écrasement de données, je suis passé d'un traitement de 15heures à 12 mn => ce n'est pas le même problème partout
    • "Worksheets(1).EnableCalculation = False" le plus souvent possible... (propriétés qu'il suffit de passer à True pour les rétablir)...=> il n'y a aucune formule dans les feuilles de données, et par ailleurs, je doute que cette option ait un impact sur la charge de la mémoire.


    Pas d'autre idée pour l'instant => elles seront les bienvenues

    NB : pour faire le parallèle avec d'autres développements, en C par erxemple, ça ressemble terriblement à de la fuite mémoire, des pb de malloc, etc.

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Citation Envoyé par dam2p
    Pour exemple, rien qu'en remplaçant dans une boucle les insert et delete de lignes par des écrasement de données, je suis passé d'un traitement de 15heures à 12 mn
    Intéressant cette observation ! Mérite une mension spéciale... Je vais te mettre une bonne note

  5. #5
    Membre régulier Avatar de zoidy
    Inscrit en
    Avril 2006
    Messages
    184
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 184
    Points : 118
    Points
    118
    Par défaut
    En faisant une comparaison de tableau à tableau au lieu de cellule à cellule tu peux gagner beaucoup de temps également.
    Je suis passé de 2h à 2min sur 2 tableaux de 25000 l'un et de 5000 l'autre, intéressant non !?

  6. #6
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Août 2007
    Messages : 36
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par ouskel'n'or Voir le message
    Intéressant cette observation ! Mérite une mension spéciale... Je vais te mettre une bonne note

    Attention, il s'agit bien d'un pb d'occupation mémoire. Mon analyse est la suivante:
    - les insert et les delete chargent l'historique des dernières instructions Excel exécutées. J'ai vu comme ça l'occupation mémoire passer de 40 Mo à 100 Mo dans cette boucle avec un ralentissement progressif des traitements qui pour un tour de boucle sont passés de qq dizièmes de secondes à plus de 5 secondes. Ainsi, en traitant dans un premier temps uniquement les insert, je suis passé de 15heures à 1heure et la charge mémoire était moindre. En traitant également les delete, je suis passé à 12mn, et la charge mémoire est restée à peu près stable.

    Mon problème est que je n'ai pas le temps nécessaire pour corriger chaque algo (il y a plus de 50 algos plus ou moins de ce type dans cette application).
    Je me demandais donc comment faire un unalloc, ou un RAZ sur l'historique sur les noeuds de l'algo principal.

    Merci pour la bonne note !
    A+
    Dam2P

  7. #7
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Citation Envoyé par dam2p
    Mon analyse est la suivante:
    - les insert et les delete chargent l'historique des dernières instructions Excel exécutées. J'ai vu comme ça l'occupation mémoire passer de 40 Mo à 100 Mo dans cette boucle avec un ralentissement progressif des traitements qui pour un tour de boucle sont passés de qq dizièmes de secondes à plus de 5 secondes. Ainsi, en traitant dans un premier temps uniquement les insert, je suis passé de 15heures à 1heure et la charge mémoire était moindre. En traitant également les delete, je suis passé à 12mn, et la charge mémoire est restée à peu près stable
    C'est logique.
    Comme je n'ai rien à ajouter (!) je te souhaite bonne chance dans tes recherches et n'hésite pas à mettre la solution si tu en trouves une nouvelle.
    A+

  8. #8
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Août 2007
    Messages : 36
    Points : 51
    Points
    51
    Par défaut
    Cher zoidy,

    Citation Envoyé par zoidy Voir le message
    En faisant une comparaison de tableau à tableau au lieu de cellule à cellule tu peux gagner beaucoup de temps également.
    Je suis passé de 2h à 2min sur 2 tableaux de 25000 l'un et de 5000 l'autre, intéressant non !?
    Mon algo ne fait pas de comparaison de données mais le sujet m'intéresse : comment fais tu la comparaison de tableau à tableaux ?
    A+
    Dam2P

Discussions similaires

  1. Comment libérer la mémoire alloué a un objet ?
    Par techz dans le forum Débuter avec Java
    Réponses: 14
    Dernier message: 26/08/2009, 08h44
  2. Comment libérer la mémoire tampon
    Par xmeszeus dans le forum Fortran
    Réponses: 4
    Dernier message: 20/11/2008, 09h29
  3. Comment libérer l'éspace mémoire utilisé par Acrobat Reader?
    Par Matt2094 dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 28/03/2006, 17h48
  4. Comment libérer la mémoire d'un TList ?
    Par Tchaill39 dans le forum Langage
    Réponses: 8
    Dernier message: 16/11/2005, 17h53
  5. Réponses: 1
    Dernier message: 21/01/2005, 13h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo