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

Interfaçage autre langage Python Discussion :

Fuite mémoire après Py_Finalize()


Sujet :

Interfaçage autre langage Python

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 55
    Points : 43
    Points
    43
    Par défaut Fuite mémoire après Py_Finalize()
    Bien le bonjour !

    Je viens de remarquer que l'utilisation d'embedding python dans une appli C++, donc en utilisant Py_Initialize() en début d'embedding et Py_Finalize() en fin dégageait une importante fuite mémoire.

    J'ai vu sur le net des articles indiquant qu'aucun fixe n'existait et qu'il fallait faire avec. Outre le fait que je trouve ça complètement inacceptable et absolument pas professionnel, je voulais savoir si certains avaient plus d'info à ce sujet et surtout si le problème persiste sur la dernière version de Python en 3.1.2 (j'utilise la 2.7).

    Merci à vous =)

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    cut&paste du Python/C API Reference Manual de 3.1.2

    void Py_Finalize()¶

    Undo all initializations made by Py_Initialize() and subsequent use of Python/C API functions, and destroy all sub-interpreters (see Py_NewInterpreter() below) that were created and not yet destroyed since the last call to Py_Initialize(). Ideally, this frees all memory allocated by the Python interpreter. This is a no-op when called for a second time (without calling Py_Initialize() again first). There is no return value; errors during finalization are ignored.

    This function is provided for a number of reasons. An embedding application might want to restart Python without having to restart the application itself. An application that has loaded the Python interpreter from a dynamically loadable library (or DLL) might want to free all memory allocated by Python before unloading the DLL. During a hunt for memory leaks in an application a developer might want to free all memory allocated by Python before exiting from the application.

    Bugs and caveats: The destruction of modules and objects in modules is done in random order; this may cause destructors (__del__() methods) to fail when they depend on other objects (even functions) or modules. Dynamically loaded extension modules loaded by Python are not unloaded. Small amounts of memory allocated by the Python interpreter may not be freed (if you find a leak, please report it). Memory tied up in circular references between objects is not freed. Some memory allocated by extension modules may not be freed. Some extensions may not work properly if their initialization routine is called more than once; this can happen if an application calls Py_Initialize() and Py_Finalize() more than once.
    Le problème persiste... et s'il est encore là c'est que sa correction n'est pas simple et/ou que sachant cela, les développeurs qui ont besoin de lancer un interpréteur Python depuis un code C trouvent facilement des solutions palliatives:
    1 - on évite de le lancer plusieurs fois,
    2 - on lance l'interpréteur dans un process séparé

    Je comprends votre frustration mais ce sont des réalités et les réalités sont têtues.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 55
    Points : 43
    Points
    43
    Par défaut
    C'est en effet quelque chose que j'avais déjà lu. A vrai dire ces derniers jours, j'ai lu une bonne dose de ref Python

    Après certes, le lancer une fois n'est pas un problème, mais une fuite mémoire en est toujours un, quoi qu'il en soit, et dans un projet professionnel, c'est embêtant.

    Le fait de lancer l'interpréteur dans un process séparé, avec Py_NewInterpreter() par exemple ne règle absolument pas le problème, il se reproduit juste sur un autre processus.

    Le but de ce topic était plus d'avoir des bribes d'info, voire des légendes urbaines qui auraient pu mener à quelque chose. Mais j'ai bien peur que je vais devoir me coltiner ce fâcheux problème.

    Néanmoins, merci de ta réponse =)

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par BigzYeah Voir le message
    Le fait de lancer l'interpréteur dans un process séparé, avec Py_NewInterpreter() par exemple ne règle absolument pas le problème, il se reproduit juste sur un autre processus.
    Py_NewInterpreter() est plus adapté pour la création de plusieurs instances de l'interpréteur dans un même process.

    Un process séparé signifie 1 instance de l'interpréteur dans son propre process. Ce qui signifie un seul appel à Py_Finalize à la mort de ce process. Pour autant qu'on souhaite toujours lancer l'interpréteur ainsi - passer par des process séparé ouvre aussi d'autres options.

    Après certes, le lancer une fois n'est pas un problème, mais une fuite mémoire en est toujours un, quoi qu'il en soit, et dans un projet professionnel, c'est embêtant.
    Le propre du "professionnel" est de construire des solutions adaptées.
    Cela suppose de bien connaître les avantages et les inconvénients des API/bibliothèques/modules qu'on va mettre en oeuvre.

    Le but de ce topic était plus d'avoir des bribes d'info, voire des légendes urbaines qui auraient pu mener à quelque chose. Mais j'ai bien peur que je vais devoir me coltiner ce fâcheux problème.
    Si vous avez besoin de lancer N*fois un interpréteur Python, vous savez maintenant ce que çà coûte de le faire avec la méthode que vous aviez initialement trouvée.
    Suivant l'application que vous voulez réaliser, elle n'est pas nécessairement à jeter juste à utiliser avec précautions si vous êtes dans les cas mentionnées dans la documentation.
    C'est pas compliqué...
    Mais les réalités sont bien moins sexy que les légendes urbaines.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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