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


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 IOError: [Errno 24] Too many open files
    Bonjour,

    Mon système de logging conserve ses fichiers ouverts pour ne pas avoir à les réouvrir à chaque write(). J'obtiens de temps en temps l'IOError: [Errno 24] Too many open files, le plus souvent lorsque le profiler appelle dump_stats()
    - Comment puis-je changer sous windows le nombre limite de fichiers ouverts par processus ?
    - Le patch suivant vise à dénombrer les fichiers encore ouverts à un moment donné. Il m'indique 59 fichiers ouverts au moment ou je catche l'IOerreur. Est-ce vraiment la limite de mon Windows ?

    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
     
    import __builtin__
    class DO_PATCH():  
        memory= {}  
        BUITINOPEN= open
        def __init__(self): 
            """ Activates patch of __builtin__.open """       
            def _open(file,*a):                
                o= DO_PATCH.BUITINOPEN(file,*a)
                DO_PATCH.memory[file]= o
                return o
            __builtin__.open= _open
        @staticmethod
        def show_use(opened=None):
            """ Show current state of all file that had been opened since patch """
            d= dict([(k,v.closed) for (k,v) in DO_PATCH.memory.items()])
            def _print(*a):
                print a
            print d
            if opened== None or opened==False:
                f= [k for (k,closed) in d.items() if closed]
                print "CLOSED ", len(f), f      
                [_print(k) for k in sorted(f)]     
            if opened== None or opened==True:
                f= [k for (k,closed) in d.items() if not closed]   
                print "OPENED", len(f), f         
                [_print(k) for k in sorted(f)]    
            return d

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 690
    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 690
    Par défaut
    Salut,

    Pourquoi poser des questions d'administration système Windows dans un forum de programmation Python?

    - Le patch suivant m'indique 59 fichiers ouverts au moment ou je catche l'IOerreur. Est-ce vraiment la limite de mon Windows ?
    De mémoire, c'est plus de 512.
    Elle sert a dimensionner une table dans l'espace virtuel des process. La limite est assez grande pour répondre aux besoins de la plupart des applications.
    C'est un peu comme le "max recursion limit de Python": il n'est raisonnable de l'augmenter qu'en sachant expliquer pourquoi pas pour masquer des bugs.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    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
    Merci Wiztricks,

    De mémoire, c'est plus de 512...La limite est assez grande pour répondre aux besoins de la plupart des applications
    Je ne vois pas comment j'aurais pu en ouvrir autant (512), et mon patch visait justement à les dénombrer. Voyez vous une raison pour que mon patch soit faux (et ne compte que 59 fichiers ouverts s'il y en a plus) ?

    des questions d'administration système Windows
    Je préférerais une solution Python pour lire ou éditer cette variable système.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 690
    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 690
    Par défaut
    Salut,

    J’évite d'essayer de décoder un code que je ne comprends pas.
    Si je lis, "l'intention"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Mon système de logging conserve ses fichiers ouverts pour ne pas avoir à les réouvrir à chaque write().
    Je me dis pourquoi pas...
    Voyons voir le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            def _open(file,*a):                
                o= DO_PATCH.BUITINOPEN(file,*a)
                DO_PATCH.memory[file]= o
                return o
    Et puis la ça fait *tilt* : comment est code "ne pas avoir à les réouvrir à chaque write()" ?
    Quel est le sujet?
    J'obtiens de temps en temps l'IOError: [Errno 24] Too many open files, le plus souvent lorsque le profiler appelle dump_stats()
    Franchement, je ne vois pas trop le rapport avec le code présente:
    c'est pas "open" qui ferme les fichiers. Eventuellement, la référence qui reste dans memory...
    Mais vous répondez:
    Je ne vois pas comment j'aurais pu en ouvrir autant (512), et mon patch visait justement à les dénombrer
    Donc on ne comprends pas trop ce qui se passe.

    Voyez vous une raison pour que mon patch soit faux (et ne compte que 59 fichiers ouverts s'il y en a plus) ?.
    Testez d'abord le programme "sans" patcher "open".
    Fonctionnellement, votre "patch" améliore les performances. Si "ailleurs" votre code fait n'importe quoi: pourquoi se casser les yeux sur ce que vous voulez bien montrer?
    Si votre code fonctionne "sans": ce sera probablement un pb. de "race condition" et éventuellement de GC. Descendre la dedans?
    Peut être mais pas être confiant d'y trouver quelque chose.

    Augmenter la variable "max handle limit" pour se convaincre que le problème n'est peut être pas ce que vous proposez de regarder?
    Je ne mets pas 1 cent. la dedans.

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

  5. #5
    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
    Il y a confusion et j'en suis désolé. J'ai indiqué pourquoi je conservais des fichiers ouverts (le loggin) pour être exhaustif, mais le code que je présente n'a rien à voir avec le loggin. Je reprends:

    Testez d'abord le programme "sans" patcher "open".
    Mon code (à cause, entre autre, de son loggin - qui n'ont rien à voir avec le patch que je présente ici) lève l'IOError "Too many files"

    Franchement, je ne vois pas trop le rapport avec le code présente:
    Le code que j'ai présenté est un utilitaire de debuggage qui permet justement de savoir combien de fichiers sont ouverts à un moment donné. J'espérais m'en servir pour voir quels fichiers j'avais oublié de fermer, et combien sont ouverts au moment ou j'ai l'erreur.
    Sa réponse (mais j'ai encore des doutes sur sa justesse) est 59 fichiers ouverts (qu sont tous censés l’être en l’occurrence, pas d'oubli de ma part)

    race condition
    -> Pas de threading dans mon code
    et éventuellement de GC
    -> Même si le GC ne collectait pas les fichiers fermés, çà n'augmenterait pas le nombre de fichiers ouverts (ils ont été close)

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 690
    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 690
    Par défaut
    Sa réponse (mais j'ai encore des doutes sur sa justesse) est 59 fichiers ouverts (qu sont tous censés l’être en l’occurrence, pas d'oubli de ma part)
    Et combien de fichier fermes (ou plutôt d’entrées dans le dict memory).
    En fait, votre code ne compte pas les ouvertures multiples d'un même fichier: le 59 est sous évalué.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 048
    Par défaut
    Il y a une méthode closed de l'objet file, qui permet de connaître l'information "le fichier est-il ouvert ?"

    Qui puis-est pourquoi l'utilisation de dictionnaire? Une simple liste où on insère l'objet file, à la rigueur, pourquoi pas?

    Je ne comprend pas pourquoi se compliquer la vie pour une question aussi simple telle que : combien de fichiers sont ouverts à un moment donné?

    Il y a aussi des conventions vraiment pas respectées, maintenant chacun code comme il veut, soit... Mais rappeler l'attribut d'une classe par classe.attribut ça me gêne vraiment question conceptuelle de la chose. Une classe c'est comme un plan afin de créer un objet, on appelle pas l'attribut du plan mais bien l'attribut de l'objet.

    Bref je trouve que ce qui est demandé est beaucoup plus simple que ce qui est présenté, je me trompe? On cherche compliqué ?

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

Discussions similaires

  1. 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
  2. IOError: [Errno 24] Too many open files -> Comment debugger ?
    Par Mistervanhalen dans le forum Général Python
    Réponses: 8
    Dernier message: 26/02/2009, 17h25
  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