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

Tkinter Python Discussion :

Gestion de la mémoire (tkinter)


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Septembre 2013
    Messages : 18
    Par défaut Gestion de la mémoire (tkinter)
    Bonjour tout le monde j'espère que vous passez de bonnes fêtes ^^

    Alors voilà la question est simple, j'ai un programme fait avec Tkinter qui possède un menu qui donne sur des fenêtre 'Help', 'About', etc
    J'ai remarqué que lorsque j'ouvrais par exemple le TopLevel 'About' et le fermer en boucle à chaque réouverture il réutilise plus de ram. Donc mettons que je l'ouvre/ferme 20x la ram utilisée va augmenter de 1Mo à chaque fois et ça fait beaucoup si c'est une fenêtre qui serait amené à se rouvrir souvent.

    J'ai donc essayer par exemple de 'del' les plus grosses variables à la fin avec un (version simplifié)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    aboutwin.protocol("WM_DELETE_WINDOW", quit_about)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def quit_about():
    	del *variables*
    Mais rien ne bouge et le phénomène recommence, alors si quelqu'un à une réponse à m'apporter sur ce comportement je suis preneur !

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 738
    Par défaut
    Salut,

    Le del d'une variable ne va pas libérer la mémoire utilisée par le widget associé. Seul .destroy() le fera... parce que la partie graphique est réalisée par TCL/Tk et que le côté Python est juste une interface.

    Là il peut y avoir des soucis, c'est lorsqu'on empile la création de widgets - ou autres - plutôt que de modifier ceux déjà créés en ne les détruisant pas "proprement".

    Il devrait vous être possible de reproduire le problème en éliminant tout le code qui ne sert à rien dans un premier temps et le code qui ne change rien dans un second temps. Cela devrait vous permettre de trouver l'opération qui...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Septembre 2013
    Messages : 18
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Le del d'une variable ne va pas libérer la mémoire utilisée par le widget associé. Seul .destroy() le fera... parce que la partie graphique est réalisée par TCL/Tk et que le côté Python est juste une interface.

    Là il peut y avoir des soucis, c'est lorsqu'on empile la création de widgets - ou autres - plutôt que de modifier ceux déjà créés en ne les détruisant pas "proprement".

    Il devrait vous être possible de reproduire le problème en éliminant tout le code qui ne sert à rien dans un premier temps et le code qui ne change rien dans un second temps. Cela devrait vous permettre de trouver l'opération qui...

    - W
    Merci de la réponse, j'ai ducoup réaliser une copie très simplifié mais ressemblant au code de base et le phénomène s'y produit aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    from tkinter import Tk, Toplevel, Label, Text, Button
     
    class TopLevel():
     
    	def __init__(self):
     
    		""" Recuperation de textes à affihcer """
    		grosse_var = open('gros_fichier_texte')
    		self.texte_gvar = ""
     
    		for line in grosse_var:
    			self.texte_gvar += line
    		grosse_var.close(); del grosse_var
    		""" ================================= """
     
    		self.top = Toplevel(root)
     
    		self.top_label = Label(self.top, text="Je suis TopLevel"); self.top_label.pack()
     
    		""" Affichage de 'texte_gvar' """
    		self.text_box_about1 = Text(self.top, height=10,width=61, wrap='word')
    		self.text_box_about1.pack()
    		self.text_box_about1.insert('end', self.texte_gvar)
    		""" ========================= """
     
    		self.top.protocol("WM_DELETE_WINDOW", self.quit_top)	# Lancer 'self.quit_top' quand on clique sur la croix
    		root.wait_window(self.top.grab_set())
     
    	def quit_top(self):
    		del self.texte_gvar
    		self.top.destroy()
     
    if __name__ == '__main__':
    	root = Tk(); root.geometry("175x30")
    	button = Button(root, text="Afficher TopLevel", command=TopLevel); button.pack()
    	root.mainloop()
    Dans le gros_fichier_texte j'y ai juste mis plein de 1 que j'ai copier/coller, le fichier que j'ai fait 40Ko.
    Je me doutais bien de ce qui prends de la place en ram mais comment la vider pour pas que ça reprenne à chaque fois de la nouvelle mémoire pour les mêmes éléments ? (car que je mette les 'del' ou non ça reste la même chose)

    EDIT: Au cas où voici le procédé que j'effectue pour vérifié ça:
    • Je lance le gestionnaire de tâche Windows (je sais il y a surement mieux niveau précision)
    • J'ouvre le programme
    • J'ouvre le Toplevel et j'attends que Python ne demande plus rien au CPU
    • Je ferme le Toplevel et j'attends encore pour le CPU


    Et là on peut voir que si on répète l'opération l'utilisation de la ram augmentera toujours plus

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 738
    Par défaut
    Salut,

    Avec le gestionnaire de tâches, on visualise la quantité de RAM allouée au processus.
    Python lui gère la "mémoire virtuelle".

    Lorsque je lis un fichier en mémoire, il va falloir allouer de la mémoire virtuelle (ou réutiliser de la mémoire libérée). Puis comme on y écrit, ces pages devront être en RAM (et la consommation de RAM augmente).

    A la 2ème itération, Python récupère la mémoire virtuelle des objets détruits mais n'est pas forcément capable de la réallouer aux nouveaux objets (ça dépend de la fragmentation, et de la défragmentation gérée par le GC). S'il alloue de nouvelles pages mémoire - virtuelle - comme on y écrit, il faudra de la RAM.

    Déjà l'objet libéré côté Python à la première itération ne va pas rendre de RAM au système: celui-ci réclamera la RAM lorsque la mémoire disponible aura atteint un certain seuil (en général à ce moment là, vous entendez le disque dur qui tourne - sauf si c'est un SSD - car libérer la RAM, c'est sauvegarder leur contenu sur disque (même si la page correspond à un objet que Python a détruit).

    Une fuite mémoire, c'est lorsque la mémoire virtuelle (ou que le nombre d'objets Python "actifs" et la place qu'ils occupent) augmente indéfiniment.

    Normalement, vous devriez avoir le même comportement sans tkinter (appels répétés d'une fonction qui ouvre un fichier, lit son contenu, on ferme le fichier et on termine).
    Ce qui permettrait de relativiser le côté TCL/tk de la chose (car les données affichées par le widget Text prennent de la place et ce n'est pas géré par Python).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Réponses: 17
    Dernier message: 02/02/2006, 12h03
  2. gestion de la mémoire
    Par moldavi dans le forum C++
    Réponses: 17
    Dernier message: 04/02/2005, 23h18
  3. Réponses: 11
    Dernier message: 26/12/2004, 22h50
  4. Gestion de la mémoire entre plusieurs DLL
    Par Laurent Gomila dans le forum C++
    Réponses: 7
    Dernier message: 27/07/2004, 15h28
  5. Gestion des variables - mémoire ?
    Par RIVOLLET dans le forum Langage
    Réponses: 4
    Dernier message: 26/10/2002, 12h44

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