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 :

Quelle est la meilleure méthode de traitement de masse ? [Python 3.X]


Sujet :

Python

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Points : 460
    Points
    460
    Par défaut Quelle est la meilleure méthode de traitement de masse ?
    Bonsoir à vous,

    ça fait un moment que je tourne en rond là et je commence à grave fatiguer...

    je suis en python3 et je veux travailler sur plusieurs milliers de fichiers (là, j'en ai 15 000 mais le but c'est de pouvoir aller plus loin).

    je fais une truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    from pathlib import Path
    import taglib
    BigDico = {}
     
    for Fichier in Path("Musiques").glob("**/*):
      if Fichier.suffix.lower() in ('.mp3', '.flac', '.wav'):
        MetaData = taglib.File(str(Fichier))
        BigDico[str(Fichier)] = MetaData
    Sauf que arriver à ~ 1500 fichiers pouf, j'ai une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OSError: [Errno 24] Too many open files
    il m'a fallut pas mal de temps pour piger qu'il fallait faire :
    histoire qu'il me foute la paix avec ça...

    mais ce n'est pas pratique si je veux partager mon soft...
    alors je peux toujours faire un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    old=$(ulimit -n)
    ulimit -n 100000
    ...
    ulimit -n $old
    mais bon, c'est pas top...

    de plus on voit la mémoire du soft qui grimpe...
    ce que je pige pas trop, c'est pourquoi ça grimpe comme ça ?
    car c'est pas le contenu du dictionnaire qui fait ça...

    Du coup, quelle serait la meilleure méthode en python pour traiter une masse de fichier ?
    j'ai essayé de passer par des QThreads (je fais du pyqt), des ThreadPoolExecutor... mais rien...

    et ces erreurs sont très courantes sur le net (et le forum) mais hormis la commande ulimit je n'ai rien trouvé...
    Des soucis de fichiers non fermes... et je n'ai pas l'impression d'ouvrir de fichier...

    Merci et bonne nuit

    Je suis sous Kubuntu avec python 3.6.3 et Qt5.10

    EDIT : Le problème vient de taglib qui ouvre des fichiers et ne doit pas les refermer du coup...
    j'essaie de le forcer à les fermer mais sans trop de succès...
    et je viens de voir que la version dispo dans les dépôts est complètement dépassée.
    J'arrive pas à installer la derniere version via le pip... erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      src/taglib.cpp:1736:50: error: no matching function for call to ‘TagLib::FileRef::create(const Py_UNICODE*&)’                                                                    
           __pyx_t_6 = TagLib::FileRef::create(__pyx_t_5);                                                                                                                             
                                                        ^                                                                                                                              
      In file included from src/taglib.cpp:578:0:                                                                                                                                      
      /usr/include/taglib/fileref.h:273:18: note: candidate: static TagLib::File* TagLib::FileRef::create(TagLib::FileName, bool, TagLib::AudioProperties::ReadStyle)                  
           static File *create(FileName fileName,                                                                                                                                      
                        ^~~~~~                                                                                                                                                         
      /usr/include/taglib/fileref.h:273:18: note:   no known conversion for argument 1 from ‘const Py_UNICODE* {aka const wchar_t*}’ to ‘TagLib::FileName {aka const char*}’           
      error: command 'x86_64-linux-gnu-gcc' failed with exit status 1                                                                                                                  
     
      ----------------------------------------                                                                                                                                         
      Failed building wheel for pytaglib
    Il semble que mutagen ne présente pas ce problème...
    Sous Kubuntu 20.04

  2. #2
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    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 : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Oui, OSError indique bien un nombre important d'ouverture, donc comme ça venait pas de ton code, ça venait d'ailleurs, en l'occurrence taglib.

    En regardant le code source de pytaglib, on remarque une méthode close existante, il suffit sans doute de l'appeler.

    Bonne journée
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Points : 460
    Points
    460
    Par défaut
    Salut,

    oui j'ai vu la méthode close dans les versions récentes mais pas dans la vieille proposée sur Kubuntu.

    j'avais testé
    Sous Kubuntu 20.04

  4. #4
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    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 : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Citation Envoyé par hizoka Voir le message
    j'avais testé
    Et tu avais le même message d'erreur ? C'est surprenant...
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Points : 460
    Points
    460
    Par défaut
    Non non une erreur disant que close n'existait pas.
    Sous Kubuntu 20.04

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 21/01/2009, 22h47
  2. Réponses: 2
    Dernier message: 10/07/2008, 12h29
  3. [HTML] quelle est la meilleure méthode pour changer la langue d'un site?
    Par poupouille dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 18/02/2008, 12h17
  4. Réponses: 12
    Dernier message: 10/08/2006, 09h44
  5. Réponses: 20
    Dernier message: 27/06/2006, 17h42

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