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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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 é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,

    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 averti
    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
    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 é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
    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 averti
    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
    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 averti
    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
    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

+ 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