|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre à l'essai
![]() |
Bonjour à tous,
J'ai écris un script python où j'utilise le module win32com et excel 2007. Dans ce script, je lis les données d'un classeur Excel. Le problème est qu'un seul processeur fonctionne pendant cette lecture alors que l'ordinateur que je possède en dispose de 4. Dans le cadre de l'optimisation de mon script, je cherche à savoir s'il y avait un moyen de fonctionner en multithread et donc d'utiliser les 4 coeurs. J'ai cherché partout mais le multithread est déjà activé dans Excel et semble ne s'appliquer que pour le calcul de formule sous Excel, et pas pour la lecture... Une autre idée était de fonctionner avec plusieurs Excel ouvert, le problème est que je ne peux pas facilement faire cela au vu de la complexité du script (interdépendance des données...) Si vous avez eu déjà ce genre de problème ou d'autres idée je suis preneur.. Merci d'avance à tous... Titi |
|
|
00
|
|
|
#2 |
|
Expert Confirmé Sénior
![]() Inscription : juin 2008 Messages : 3 709 ![]() |
Salut,
Quel est le volume Mo? nombre de lignes à lire? En combien de temps doit on les lire? Pourquoi ne pas mettre les données dans un ou plusieurs fichiers .CSV plutôt que d'y accéder avec XL au milieu? - W
__________________
Architectures Post-Modernes |
|
|
00
|
|
|
#3 |
|
Membre à l'essai
![]() |
Bnojour,
Les deux fichiers lus font chacun 12 Mo. Le nombre de ligne est de 52 000 environ et le nombre de colonnes est de 40 environ. Bien sûr, je les lis une seule fois et je les mets dans une grosse matrice pour ne plus avoir à m'en soucier ensuite. Le temps de lecture est de 5-6h. J'aimerais bien le diminuer un peu... Ok pour le CSV, totalement d'accord, mais ça reste un fichier texte à lire donc même temps de lecture (ou équivalent)... et ca pousse l'utilisateur à faire une manip supplémentaire, ce que je souhaiterai éviter... |
|
|
00
|
|
|
#4 | ||||
|
Expert Confirmé
![]() ![]() Inscription : décembre 2007 Messages : 1 777 ![]() |
Bonjour,
Comme j'utilise beaucoup les csv pour échanger des données entre une base de donnée et excel, j'étais curieux des temps de lecture d'un fichier csv aussi grand. Alors j'ai fait l'essai, avec une astuce que j'utilise pour résoudre les problèmes d'encodage des fichiers csv: passer par l'intermédiaire d'un fichier en mémoire (module cStringIO). Voilà l'essai et ses résultats: 1- j'ai créé un fichier "listecsv52000x40.csv" formé de 52000 lignes et 40 champs séparés par des ';' et composés de mots au hasard (nb de car entre 5 et 20). Voilà la 1ère ligne: Citation:
2- Pour lire ce fichier csv et le transformer en liste de listes grâce au module csv, je fais l'opération en 2 temps: a- lecture binaire du fichier csv, et écriture binaire d'un fichier cStringIO en mémoire b- convertion "csv" de ce fichier en mémoire en liste csv grâce au module csv. Voilà le code: Code :
Citation:
__________________
Ne rien ranger permet d'observer la loi universelle d'entropie: l'inévitable convergence vers le chaos... Mes recettes python: http://www.jpvweb.com |
||||
|
|
00
|
|
|
#5 |
|
Membre à l'essai
![]() |
Bon, j'ai fait des recherches sur le multithread. Apparement, on peut encore attendre pour que les opérations de lecture de fichier Excel se fasse sur plusieurs coeurs en même temps.
Ta proposition me va ! Merci à toi tyrtamos pour cette petite astuce. Elle fonctionne très bien sur mon problème et les temps sont complètement réduits avec Python 2. Par contre en Python 3, j'ai des bugs... Au lieu d'utiliser les listes de liste, j'utilise numpy, franchement plus facile à utiliser ! |
|
|
00
|
|
|
#6 | |
|
Expert Confirmé Sénior
![]() Inscription : juin 2008 Messages : 3 709 ![]() |
Citation:
Pour éviter la manip supplémentaire, xlrd devrait savoir lire des fichiers .XLS natif (version < 2007) Pour les versions 2007, c'est du XML... Je ne sais pas s'il existe un brico plus ou moins utilisable pour lire le fichier directement. On peut bien sur utiliser XL pour faire la conversion. - W
__________________
Architectures Post-Modernes |
|
|
|
10
|
|
|
#7 |
|
Expert Confirmé
![]() ![]() Inscription : décembre 2007 Messages : 1 777 ![]() |
Avec Python 3, cStringIO se trouve dans le module io.
Je ne connais pas encore suffisamment Python 3 pour te faire la conversion. Tu peux te faire aider par l'outil 2to3.py qui, sous Windows, se trouve dans C:\Python27\Tools\Scripts. Mais ça ne suffira pas, à cause, en particulier, de la distinction byte <=> str. Je profite de ce message pour signaler un petit problème dans les transferts de nombres flottants entre Python et Excel par fichier csv: avec une locale française, les nombres flottants Excel contiennent une virgule décimale et Python un point décimal. Il y a donc une conversion à faire, avec une difficulté: vu par Python, le nombre issu d'Excel est une chaine de caractère. Il faut donc faire une reconnaissance du nombre flottant avec une expression régulière.
__________________
Ne rien ranger permet d'observer la loi universelle d'entropie: l'inévitable convergence vers le chaos... Mes recettes python: http://www.jpvweb.com |
|
|
00
|
|
|
#8 |
|
Membre à l'essai
![]() |
oui effectivement avec Py3 ca bug. J'avais essayé io mais c'est pas très concluant... à cause de la distinction byte et str. C'est malheureux !! (Au passage, si quelqu'un a une idée sur la cause de cette erreur, qu'il ne se fasse pas désiré
Du coup, je vais migrer mon code en 2.x et voir si toutes les bibliothèques suivent correctement. Merci tout de même... |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com