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

Python Discussion :

Fuite mémoire ?


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 114
    Par défaut Fuite mémoire ?
    Bonjour

    Mon programme est une boucle infinie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while 1:
       do_something()
    Au début, pas de problème, je le lançais, il pouvait tourner des semaines, la consommation mémoire restait stable. je testais la consommation mémoire avec la commande top : le programme consomme environ 10% de la mémoire.

    Biensur, j'ai fait plein de développement dans mon do_something(), et maintenant, je vois qu'en général sur une semaine, le programme passe de 10% à 80% de la mémoire.

    Donc, j'ai cherché à comprendre ce qu'il se passe.

    1 - je me suis plongé dans le module gc. J'ai notamment beaucoup regardé la fonction gc.get_objets(). J'ai constaté le nombre d'objets géré par le garbage collector reste stable : il oscille entre 42000 et 43000.

    2 - j'ai ensuite suivi d'un peu plus prêt la consommation mémoire, pour cela je vais lire /proc/pid/stat, champ 24 (d'après le man : rss %ld Resident Set Size: number of pages the process has in real memory.... ). Je constate que cela augmente bien. Cela augmente pas vraiment à moment caractéristique, un peu à tout moment tout au long du programme.

    Donc pour l'instant, j'en suis à :
    - le rss augmentant, la taille mémoire de mon programme augmente bien.
    - le garbage collector gère toujours le même nombre d'objet, donc pas de fuite flagrante.

    Est-ce que quelqu'un aurait un conseil de direction ou chercher maintenant ?
    Est-ce que les "objets non-mutable" pourrait créer une fuite mémoire ?



    Cordialement
    Emmanuel

  2. #2
    Membre Expert
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Par défaut quelques idées
    Juste quelques petites pistes:

    1/ Est-ce que tu utilises des ressources (fichier, socket) que tu aurais oublié de fermer ?

    2/ Est-ce que tu crée des threads (de plus en plus) ?

    3/ est ce que la taille des objets que tu traites (listes et dict) augmente ?

    4/ Est ce que tu utilises des références cycliques? Par exemple avec 2 objets a et b:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    a.versB= b
    b.versA= a
    Si c'est le cas, a et b ne seront pas collectés par le GC

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    A voir aussi:
    En CPython 2.x, les objets de type int et float ne sont jamais libérés (mais ils sont réutilisés); si tu utilises un grand nombre d'entiers et de flottants avec des valeurs différentes, cela pourrait aussi être la cause.
    En CPython 3.x, cela ne concerne plus que les floats, je pense.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 114
    Par défaut
    Bonjour

    Note : j'ai oublié de préciser que j'utilise Python 3.1.3 sous Ubuntu 10.04 LTS. J'ai reproduit le même phénomène sous Python 3.2.

    Juste quelques petites pistes:

    1/ Est-ce que tu utilises des ressources (fichier, socket) que tu aurais oublié de fermer ?
    Oui j'utilise beaucoup de sockets, de fichiers etc . A priori, toutes les ouvertures ont lieu avant l'entrée dans la boucle infinie, et les fermetures à la sortie.
    Comment vérifier qu'il n'y a pas dans un coin un bout de code qui ouvre une telle ressource sans la fermer ?
    Est-ce qu'ouvrir un fichier est suivre le n° attribuer est suffisant ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    with open("toto", "r") as f:
        print("no=", f.fileno())
    2/ Est-ce que tu crée des threads (de plus en plus) ?
    Je n'oublie pas complétement cette idée, mais là c'est beaucoup moins probable.

    3/ est ce que la taille des objets que tu traites (listes et dict) augmente ?
    Existe-t-il une astuce pour cibler rapidement les plus grande liste et dictionnaire pour vérifier cela ?

    4/ Est ce que tu utilises des références cycliques? Par exemple avec 2 objets a et b:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    a.versB= b
    b.versA= a
    Si c'est le cas, a et b ne seront pas collectés par le GC
    Dans ce cas, est-ce que le nombre d'object géré par le GC (gc.get_objects()) ne devrait pas aussi augnmenter ?

    A voir aussi:
    En CPython 2.x, les objets de type int et float ne sont jamais libérés (mais ils sont réutilisés); si tu utilises un grand nombre d'entiers et de flottants avec des valeurs différentes, cela pourrait aussi être la cause.
    En CPython 3.x, cela ne concerne plus que les floats, je pense.
    Je suis donc potentielement soumis à ce problème concernant les float ? Comment je peux vérifier qu'il y a de plus en plus de float en mémoire ?


    Cordialement
    Emmanuel

  5. #5
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    bonjour,

    en utilisant guppy ?

    et plus particulièrement ça: http://guppy-pe.sourceforge.net/#Heapy

Discussions similaires

  1. [tomcat][memoire] java.net.URL et fuite mémoire
    Par Seiya dans le forum Tomcat et TomEE
    Réponses: 6
    Dernier message: 09/03/2009, 10h41
  2. [Fuites mémoire] Je cherche un utilitaire
    Par 10_GOTO_10 dans le forum C++Builder
    Réponses: 8
    Dernier message: 10/02/2005, 10h03
  3. Outil de recherche de fuite mémoire
    Par eag35 dans le forum MFC
    Réponses: 4
    Dernier message: 02/02/2005, 12h46
  4. [SWT]SWT et fuite mémoire(ou pas)
    Par menuge dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 22/06/2004, 21h40
  5. [debug] fuites mémoires
    Par tmonjalo dans le forum C
    Réponses: 3
    Dernier message: 28/07/2003, 17h20

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