Précédent   Forum du club des développeurs et IT Pro > Autres langages > Python & Zope > Bibliothèques tierces
Bibliothèques tierces Forum d'entraide pour les autres bibliothèques non présentes dans la distribution standard de Python
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 25/07/2012, 12h08   #1
sir_nebuchadnezzar
Membre à l'essai
 
Homme Etienne
Inscription : février 2012
Messages : 39
Détails du profil
Informations personnelles :
Nom : Homme Etienne
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2012
Messages : 39
Points : 20
Points : 20
Envoyer un message via MSN à sir_nebuchadnezzar
Par défaut [win32com][Excel] Lecture d'un tableau excel avec plusieurs coeurs

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
sir_nebuchadnezzar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/07/2012, 16h11   #2
wiztricks
Expert Confirmé Sénior
 
Inscription : juin 2008
Messages : 3 709
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 3 709
Points : 4 546
Points : 4 546
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
wiztricks est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2012, 10h38   #3
sir_nebuchadnezzar
Membre à l'essai
 
Homme Etienne
Inscription : février 2012
Messages : 39
Détails du profil
Informations personnelles :
Nom : Homme Etienne
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2012
Messages : 39
Points : 20
Points : 20
Envoyer un message via MSN à sir_nebuchadnezzar
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...
sir_nebuchadnezzar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2012, 12h49   #4
tyrtamos
Expert Confirmé
 
Avatar de tyrtamos
 
Inscription : décembre 2007
Messages : 1 777
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 1 777
Points : 3 049
Points : 3 049
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:
"OsFyMvhyNecsvIOfhxYx";"GKEnbwXgvRhYQEueqDnw";"xKguJmqWROXJQ";"aBBUWwgGo";"Jtfyck";"AiciRiSQNBIphCPQBB";"ZfFrxXOeOSRGglXJL";"xRfyhajcHRGzJmToJr";"LvsNBFBccFSb";"yXNUDgtRPkbZx";"dVobyXG";"cYOIBsILgIG";"FFVmimyMGrJF";"cokaGlVFVQodiyScdvMn";"KwlHIxjzCPqyrhFbiL";"PMQWnaFNnemPaekGvgp";"jyuYMWsANJ";"pfAxTDMNxvzXGScoz";"gIbpbdKzCrGkwTGvB";"utntWWCJBRGSuhmyIFB";"TCMlXjJR";"ojkEDBMJcKrgwQy";"ZjtDPpPdmUTexOudLaw";"UuFOfKtrapXosxqBvAun";"xZpFECpGUutoMY";"NnsKmfX";"gRFCEHC";"NRALTj";"vbcCEDAYfe";"cgBYwxl";"wrbuUdjtovsi";"sYVnvLpnsADhbEhHgGRI";"wjCAdxtOsIPxNXneTTe";"SecKlUzjcctTU";"MqKzNyCRegUzNzUAQ";"UhocyloaWSoPrzh";"PcpSUqetuQhAgVZ";"BmLNqYXH";"QWCnRCRd";"bNttolExZNNqCeKWNHx"
Ce fichier fait environ 30 Mo.

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 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
fichiercsv = "listecsv52000x40.csv"
 
# mettre le fichier csv en mémoire
fstr = cStringIO.StringIO()
with open(fichiercsv, 'rb') as f:
    fstr.write(f.read())
 
# convertir le fichier csv en liste de liste
fstr.seek(0) # pour revenir en début de fichier
lectcsv = csv.reader(fstr, delimiter=';')
 
# lecture des 10 premières lignes
i = 1
for ligne in lectcsv:
    print i, ligne
    i += 1
    if i>10:
        break
ce qui donne pour la 1ère ligne

Citation:
1, ['OsFyMvhyNecsvIOfhxYx', 'GKEnbwXgvRhYQEueqDnw', 'xKguJmqWROXJQ', 'aBBUWwgGo', 'Jtfyck', 'AiciRiSQNBIphCPQBB', 'ZfFrxXOeOSRGglXJL', 'xRfyhajcHRGzJmToJr', 'LvsNBFBccFSb', 'yXNUDgtRPkbZx', 'dVobyXG', 'cYOIBsILgIG', 'FFVmimyMGrJF', 'cokaGlVFVQodiyScdvMn', 'KwlHIxjzCPqyrhFbiL', 'PMQWnaFNnemPaekGvgp', 'jyuYMWsANJ', 'pfAxTDMNxvzXGScoz', 'gIbpbdKzCrGkwTGvB', 'utntWWCJBRGSuhmyIFB', 'TCMlXjJR', 'ojkEDBMJcKrgwQy', 'ZjtDPpPdmUTexOudLaw', 'UuFOfKtrapXosxqBvAun', 'xZpFECpGUutoMY', 'NnsKmfX', 'gRFCEHC', 'NRALTj', 'vbcCEDAYfe', 'cgBYwxl', 'wrbuUdjtovsi', 'sYVnvLpnsADhbEhHgGRI', 'wjCAdxtOsIPxNXneTTe', 'SecKlUzjcctTU', 'MqKzNyCRegUzNzUAQ', 'UhocyloaWSoPrzh', 'PcpSUqetuQhAgVZ', 'BmLNqYXH', 'QWCnRCRd', 'bNttolExZNNqCeKWNHx']
Le temps d'exécution de cette lecture et conversion de ce fichier de 30 Mo est... quasi immédiat! (<1/10s)
__________________
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
tyrtamos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2012, 13h43   #5
sir_nebuchadnezzar
Membre à l'essai
 
Homme Etienne
Inscription : février 2012
Messages : 39
Détails du profil
Informations personnelles :
Nom : Homme Etienne
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2012
Messages : 39
Points : 20
Points : 20
Envoyer un message via MSN à sir_nebuchadnezzar
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 !
sir_nebuchadnezzar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2012, 14h13   #6
wiztricks
Expert Confirmé Sénior
 
Inscription : juin 2008
Messages : 3 709
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 3 709
Points : 4 546
Points : 4 546
Citation:
Envoyé par sir_nebuchadnezzar Voir le message
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...
Tyrtamos vous à montré que lire le .CSV était quand même redoutable.

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
wiztricks est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/07/2012, 15h35   #7
tyrtamos
Expert Confirmé
 
Avatar de tyrtamos
 
Inscription : décembre 2007
Messages : 1 777
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 1 777
Points : 3 049
Points : 3 049
Citation:
Envoyé par sir_nebuchadnezzar Voir le message
Par contre en Python 3, j'ai des bugs...
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
tyrtamos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2012, 17h01   #8
sir_nebuchadnezzar
Membre à l'essai
 
Homme Etienne
Inscription : février 2012
Messages : 39
Détails du profil
Informations personnelles :
Nom : Homme Etienne
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2012
Messages : 39
Points : 20
Points : 20
Envoyer un message via MSN à sir_nebuchadnezzar
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...
sir_nebuchadnezzar est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 02h29.


 
 
 
 
Partenaires

Hébergement Web