Contenu | Rechercher | Menus

Annonce

L'équipe des administrateurs et modérateurs du forum vous invite à prendre connaissance des nouvelles règles.
En cas de besoin, vous pouvez intervenir dans cette discussion.

N'oubliez pas de cocher la case « Ajustement pour l'heure d'été » dans votre profil.

Ubuntu 16.04 LTS
Commandez vos DVD et clés USB Ubuntu-fr !

Pour en savoir un peu plus sur l'équipe du forum.

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

#1 Le 25/02/2018, à 01:38

Hizoka

[Résolu] 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 :

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 :

OSError: [Errno 24] Too many open files 

il m'a fallut pas mal de temps pour piger qu'il fallait faire :

ulimit -n 1000000

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 :

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...
et je n'ai pas l'impression d'ouvrir de fichier...

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 mais hormis la commande ulimit je n'ai rien trouvé...

Merci et bonne nuit smile

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 :

  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 probleme...

Dernière modification par Hizoka (Le 25/02/2018, à 02:58)

Hors ligne

#2 Le 26/02/2018, à 01:06

J5012

Re : [Résolu] Quelle est la meilleure méthode de traitement de masse ?

2 questions :
1/ comment la taglib lit-elle les meta donnees , est-elle obligé d'ouvrir le fichier ? et pourquoi ne le ferme-t-elle pas tout de suite apres ?
2/ la boucle for memorise la memoire disponible de facon statique, et ne la libere que lorsque celle ci se termine ...
→ c'est tres depensier et pas tres economique comme tu as pu le voir ...

Hors ligne

#3 Le 26/02/2018, à 09:43

Hizoka

Re : [Résolu] Quelle est la meilleure méthode de traitement de masse ?

Salut,
ça venait bien de taglib qui était une très vielle version et qui n'avait à priori pas de méthode close contrairement aux dernières versions.
mais n'arrivant pas à la compiler, je suis passé à mutagen qui est lui relativement à jour.

Et du coup je suis passé de 700mo de mémoire avec taglib à 50mo avec mutagen, ce qui me va mieux smile

Hors ligne