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 :

IOError: [Errno 24] Too many open files -> Comment debugger ?


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 42
    Points : 24
    Points
    24
    Par défaut IOError: [Errno 24] Too many open files -> Comment debugger ?
    Hello,

    Voila j'ai un soucis que j'arrive à résoudre et qui est dur à debugger. J'aimerai savoir si il existe quelques choses pour voir le nombre de fichier courrant ouvert. Car je comprends pas je fais des close de tout mes fichiers je fais des del de tout mes objets je prends soin de ma mémoire continuellement et j'obtiens ce message après 3 heures de calcul.

    Le script utilise une 20aines de classe. La base du script et une boucle de 10 000 iterations, à chaque boucles plusieurs objets sont creé et traité et puis détruis à chaque itérations.

    Est il possible de savoir l'état de la mémoire à chaque itération, quels fichiers sont ouvert, quelles classes est instancié.

    Merci d'avance,

    Mister

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    Bonjour,

    J'ai essayé de reproduire ton message d'erreur. J'y arrive avec le script suivant:

    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
    import os
     
    def open_file(name,close=True):
     
        fichier=open(name,'w')
        if close:
            fichier.close()
        return fichier
     
    def main():
     
        files=[]
        for i in range(10000):
     
            name="test01"+os.sep+str(i)+".txt"
            files.append(open_file(name))
     
    if __name__ == "__main__":
     
        main()
    Si je ferme les fichiers après les avoir ouverts, je n'ai pas d'erreur, si je ne les ferme pas, j'ai une erreur (IOError [Errno 24] Too many open files).

    Du coup, es-tu vraiment sûr que tous les fichiers sont bien fermés ?

    Pour répondre à une de tes questions, je peux te proposer une classe pour gérer l'ouverture et la fermeture de tes fichiers:

    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
    37
    38
    39
    40
    41
    import os
     
    class FilesManager(object):
     
        def __init__(self):
     
            self._files={}
            self._nbOpenedFiles=0
     
        def open(self,name,mode='w'):
     
            try:
                self._files[name]=open(name,mode)
                self._nbOpenedFiles+=1
            except IOError:
                raise TooManyFiles(self._nbOpenedFiles)
     
        def close(self,name):
     
            self._files[name].close()
            self._nbOpenedFiles-=1
     
    class TooManyFiles(IOError):
     
        def __init__(self,nbfiles):
     
            msg="Deja %s fichiers ouverts. Je ne peux pas en ouvrir plus." % str(nbfiles)
            IOError.__init__(self,msg)
     
    def main():
     
        files=FilesManager()
     
        for i in range(10000):
     
            name="test01"+os.sep+str(i)+".txt"
            files.open(name)
     
    if __name__ == "__main__":
     
        main()
    qui t'affichera un truc du genre:

    Deja 509 fichiers ouverts. Je ne peux pas en ouvrir plus.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 42
    Points : 24
    Points
    24
    Par défaut
    Merci beaucoup c'est super sympa !!!

    Je vais essayer d'implémenter ça mais ça va etre long car j'ai énormément de fichier et de library.

    Je vous dis quand j'ai finis !!

    Aussi je me demains : est ce que l'utilisation de popen2 peut creer ce genre de probleme en l'utilisant comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    score = float(re.compile("G_DATA    (.*?)\n",re.DOTALL).findall(os.popen2(command)[1].read())[0].strip())
    Derniere question dans ton script c'est quoi la signification du _ avant une variable ? Est une notation à toi ou il y a t il une signification spécifique ? (lié/non lié à l'héritage ?)

    Merci encore !

    Mister

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    c'est juste une convention personnelle. si je vois un _ devant le nom d'un attribut ou méthode, je ne l'utilise pas en dehors de la classe. je n'utilise pas le __ parce que parfois je ne le trouve pas assez souple.

    disons que c'est ma façon de gérer les statuts "Privé" et "Public" qu'il peut y avoir dans d'autres langages.

    J'ai lu une fois (je ne me souviens plus où mais il me semble que c'était sur le site officiel Python):

    "En python, pas de public, pas de privé, on est entre adultes consentants"

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 42
    Points : 24
    Points
    24
    Par défaut
    Ah ok. J'avais déja cherché si on pouvait faire du public et privé en python et j'avais pas trouvé. Donc visiblement c'est nous qui choisisons la notation mais il n'y a pas possibilité de le faire réellement.

    Bon j'ai localisé le probleme mais j'arrive pas à la résoudre en faite ça vient pas de mes .close() ni de mes open()

    Je vous expose le probleme :
    Voila essayer ce code ça plante et je sais vraiment pas pourquoi j'ai mis del j'ai mis du rm j'ai tout testé alors que normalement ce n'est pas utile. mkstemp renvoie un tuple mais pas un fichier donc normalement ça devrait etre bon... aidez moi :'(


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import os
    import tempfile
     
    for i in range(10000):
        ad = tempfile.mkstemp()
        f2 = open(ad[1],"w")
     
        f2.close()
        os.system("rm %s"%(ad[1]))
        del(ad)
        print i

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 42
    Points : 24
    Points
    24
    Par défaut
    J'ai trouvé une alternative mais je ne comprends toujours pas le probleme.

    En utilisant mktemp au lieu de mkstemp ça fonctionne ... aucune idée pourquoi ...

    G

  7. #7
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    même chose chez moi.

    comme je ne connaissais pas tempfile j'ai jeté un coup d'oeil sur:

    http://docs.python.org/library/tempf....TemporaryFile

    j'ai vu que mktemp() est dépréciée.

    Est ce que tempfile.TemporaryFile() ne serait pas plus indiqué pour ton pb ? en plus tu n'as plus à te soucier de la fermeture des fichiers. autre avantage il retourne directement un objet fichier que tu peux manipuler (write()...).

  8. #8
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Il faut comparer ce que font mktemp() et mkstemp() et voir les différences (nooon ? sans blague !?)
    Par exemple:
    - mkstemp() Creates a temporary file in the most secure manner possible
    mktemp() Use of this function may introduce a security hole in your program.
    Manifestement une différence de niveau de sécurité.
    - Unlike TemporaryFile(), the user of mkstemp() is responsible for deleting the temporary file when done with it.

    En rapport avec ça ? ou d'autres choses ?
    Pas moi qui le dirai

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 42
    Points : 24
    Points
    24
    Par défaut
    Oui mais dans mon cas je veux juste avoir une adresse de temp mais pas de creation du fichier. Je veux gerer tout seul la génération de fichier.

    Je veux bien creer un mkstemp mais comment on le ferme ?
    tempfile.mkstemp() creer un fichier, ok et renvoit un tuple

    Comment je manage ce fichier ? faire un open et close dessus ne l'élimine pas de mémoire de python ( voir dans /proc/ID_DU_JOB/df/ --> le lien du fichier est dedans du coup on sature la mémoire du coup Error Too many file open

    Mister

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. IOError: [Errno 24] Too many open files
    Par shaiHulud dans le forum Général Python
    Réponses: 15
    Dernier message: 04/12/2013, 14h44
  2. IOError: [Errno 24] Too many open files ?
    Par axel584 dans le forum Général Python
    Réponses: 1
    Dernier message: 22/05/2012, 11h16
  3. Too many open files
    Par ppmaster dans le forum Weblogic
    Réponses: 1
    Dernier message: 11/09/2007, 14h17
  4. [Système] failed to open stream: Too many open files
    Par shamanlinks dans le forum Langage
    Réponses: 7
    Dernier message: 23/05/2006, 11h59
  5. Pb avec socket - too many open files
    Par be_tnt dans le forum Réseau
    Réponses: 16
    Dernier message: 17/05/2006, 10h46

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