Microsoft 365 Dictionaries dictionary & RAM / Excel ne libère la RAM qu'à fermeture complète. Nothing meilleur que Remove.all ? Dictionnaires mémoire vive

Charly88

XLDnaute Occasionnel
Bonjour à tous, question ouverte/générale
J'ai une surconsommation de RAM / mémoire vive sur une appli que j'ai construite après, enfin, avoir compris l'immense potentiel des Dictionaries.
J'avais remarqué que la consommation de RAM avait tendance à grimper si j'utilisais l'appli longtemps mais je suspectais la configuration tordue de l'espace TSE / Win Serveur où j'exécute l'appli d'être en cause car elle est globalement mauvaise (un fichier XL s'y ouvre deux fois plus lentement qu'en local.)
Mais après nouveaux tests en local, la surconso semble bien inhérente à l'appli. Mon intuition actuelle est que bien que j'ai mis des Dic.RemoveAll partout et si les dictionnaires sont bien vidés... Cela ne libère pas la RAM initiale => chaque exécution s'additionne aux précédentes.
Je comprends/devine de quelques posts anglais que Set Mondico = nothing pourrait être plus efficace que Remove.all

Questions :

-Pourquoi diable la RAM n'est-elle libérée après le Remove.all ?
-Ou même quand j'appuie sur le bouton Reset de l'écran VBA ?
-A court terme, la seule façon que j'ai de vraiment régler le problème sans coder, c'est de totalement fermer Excel. C'est-à-dire que si j'utilise l'appli + un petit fichier vide à côté, monte à 2 Go de RAM puis ferme l'appli = je reste à 2 Go occupés par Excel tant que je ne l'ai pas fermé le dernier petit fichier vide.
Qu'est-ce que cette sorcellerie Messires/Gentes Dames ?!
Merci d'avance pour toutes vos lumières.
 

dysorthographie

XLDnaute Accro
Bonjour,
En soit il suffit de placer le dictionnarry à Nothing pour libérer la mémoire de cette objet!

Mais il est pas rare d'associer un module de classe à un dictionnarry ; il n'est pas rare également de gérer des objets dans ces modules de classe !

Vue qu'un Set doit toujours avoir sa contrepartie Set Nothing il est recommandé pour les modules de classe d'implémenter l'événement terminante du module de classe pour Seter à Nothing tous les objets !

Tous les événements terminante des modules de classe s'executeront automatiquement au Set Nothing du dictionnarry.

Notes également que déclaréer en public ton dictionnarry dans un module standard garde l'objet en mémoire !

Déclarer ton dictionnaire dans un sub ou une fonction limite sa durée de vie à la sub ou la fonction.

Dans tous les cas il est recommandé de Seter à Nothing. L'explicite est préférable à l'implicite !
 
Dernière édition:

Charly88

XLDnaute Occasionnel
OK... Je vais déjà partir là-dessus, ce devrait être assez rapide pour voir ou non les résulats. J'étais convaincu que RemoveAll faisait précisément cela / était explicite. Je ne vois pas du coup son intérêt par rapport à nothing.

Et je ne comprends l'idée selon laquelle les Dictionnaires ou Array peuvent être vidées de leur contenu d'une manière ou d'une autre (code, crash, reset...) mais qu'Excel / VBA continue d'occuper la RAM qui leur a été allouée précédemment.
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

RemoveAll ne fait que supprimer les items d'un dictionnaire, pas le dictionnaire lui-même., le dico existe toujours, d'ailleurs vous pouvez lui rajouter des items, ce qui ne sera pas le cas lorsqu'il sera = nothing !

Cordialement
 

Dranreb

XLDnaute Barbatruc
Bonsoir.
Il est possible que la taille mémoire réservée par un Dictionary ou une Collection soit délibérément très grande, voire partageable entre plusieurs Dictionary. C'est dû à la philosophie d'accès aussi direct que possible aux clés, obtenu par un calcul style générateur aléatoire partant de leurs valeurs. Une grande taille mémoire minimise le risque que le calcul aboutisse au même emplacement pour des valeurs de clés différentes, ce qui, à chaque fois que cela arrive, oblige à une petite recherche séquentielle à partir de l'emplacement calculé.
 

Statistiques des forums

Discussions
312 106
Messages
2 085 352
Membres
102 871
dernier inscrit
Maïmanko