Page 1 sur 1
[R] Utilisation de RAM trop importante
Posté : mer. 14 janv. 2015 11:38
par Faco
Bonjour all,
je me suis fais un script avec GUI pour gérer mais différents parc informatique qui fonctionne bien et n'utilise pas grand chose en RAM (5-7 Mo) quand je l'utilise.
Mon soucis c'est que si j'oublie de le refermer quand je pars et que je reviens 1 ou 2 semaines après, il frôle le giga en RAM ( 600-800 Mo).
J'aurai aimé savoir si vous connaitriez un moyen d'identifier les problèmes ou des bonne pratique pour libérer les ressources.
je dois avoir des fileopen sans fileclose,...., des truc dans le genre et j'aurais aimé identifier les fonctions à risques.
dans mon code :
1-Gui : boutons, tabs, Menu, edittext, listviews + menucontextuel
2-Script : INIread/iniwrite, Run/runwait, fileopen/fileclose
3-Et surtout (d'où viens certainement le prob) : une fonction "refresh" dans laquelle je recharge mon listeview principal et lance une commande avec Run.
J'ai toujours la possibilité d’arrêter le programme au bout d'une heure d'inactivité mais je préférerai nettoyer mon code.
(le temps d'écrire le message, mon programme est passer de 6.5 Mo à 14.4 Mo)
Merci

Re: [..] Utilisation de RAM trop importante
Posté : mer. 14 janv. 2015 13:03
par Y01
Bonjour,
Peut être qu'avec le code, il serait plus simple de voir ce qui ne va pas.
Re: [..] Utilisation de RAM trop importante
Posté : mer. 14 janv. 2015 13:09
par jguinch
C'est compliqué de répondre sans voir le script...
Qu'est censé faire ton script ?
Utilises-tu des tableaux (array) ?
Le FileClose n'est pas obligatoire mais conseillé, c'est une bonne pratique.
(edit : tu dois l'utiliser si tu ré-ouvres le fichier plusieurs fois)
Si la RAM évolue de cette façon, c'est que certaines variables accumulent des données.
Si tu as des variables qui stockent beaucoup d'informations, il faut réfléchir à une manière d'optimiser ça :
- est-ce que tu as besoin des données en permanence dans ton script ?
- est-ce que tu peux externaliser les données (base de donnée ou fichier texte/ini)
Une bonne pratique est de "vider" les variables qui utilisent de la mémoire si tu ne t'en sert plus. Par exemple, si tu as une variable qui contient l'intégralité d'un fichier de plusieurs Mo, il faut penser à vider la variable si tu n'a pas besoin d'y accéder régulièrement dans ton script (quitte à relire le fichier - ce qui est rapide).
Pour vider une variable, il suffit de lui attribuer une valeur vide.
Voilà, un peu en vrac quelques idées...
Re: [..] Utilisation de RAM trop importante
Posté : mer. 14 janv. 2015 14:57
par mikell
Peut-être aussi des lancements successifs de Run (tester avec RunWait serait concluant)
Re: [..] Utilisation de RAM trop importante
Posté : mer. 14 janv. 2015 17:40
par orax
jguinch a écrit :Une bonne pratique est de "vider" les variables qui utilisent de la mémoire si tu ne t'en sert plus.
1. Mais comment les "vider" ? Il semble qu'il y ait quelques subtilités.
Dans cet exemple, je lis un fichier de 100 Mo. Je pensais que "vider" $f avec
$f = "" était suffisant mais apparemment non puisque la mémoire utilisée ne redescend pas ("working set" = 283 Mo après lecture du fichier).
► Afficher le texte
Code : Tout sélectionner
_mem('au lancement') ; 6
$f = FileRead('C:\t\100.vhdx')
_mem('après lecture du fichier') ; 283
$f = ""
_mem('"" chaîne vide') ; 283
$f = '0'
_mem("'0' nombre sous forme de chaîne") ; 283
; avec Null ou un nombre la mémoire retombe à 7 Mo
$f = Null
_mem('Null') ; 7
; ou
;~ $f=0 ; ou 1, 2, 3...
;~ _mem('un nombre') ; 7
Func _mem($msg = '-')
$mem = ProcessGetStats()
ConsoleWrite($msg & ' : ' & Round($mem[0] / 1000000) & @CRLF)
EndFunc ;==>_mem
2. L'utilisation de ByRef (Par Référence) pourrait être intéressante dans certains cas (si les variables à passer sont volumineuses).
Toutefois, j'ai fait des essais avec et sans "ByRef" mais je n'ai pas vu de différence concernant la consommation mémoire.
3. Les variables locales, à l'intérieur d'une fonction, seront automatiquement vidées lorsque la fonction est terminée.
Re: [..] Utilisation de RAM trop importante
Posté : mer. 14 janv. 2015 21:16
par jguinch
Dans l'aide, section
Keyword Reference, il est expliqué comment vider un tableau en affectant la valeur 0 à celui-ci.
C'est aussi vrai pour les autres variables. (j'avais en tête qu'il fallait mettre une valeur vide "" mais c'était 0

)
Re: [..] Utilisation de RAM trop importante
Posté : jeu. 15 janv. 2015 09:33
par Faco
Oki merci pour les pistes, je vais m’atteler au nettoyage.