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

Bibliothèques tierces Python Discussion :

[win32com][Excel] Lecture d'un tableau excel avec plusieurs coeurs


Sujet :

Bibliothèques tierces Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2012
    Messages : 39
    Points : 31
    Points
    31
    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

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 276
    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 276
    Points : 36 761
    Points
    36 761
    Par défaut
    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.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2012
    Messages : 39
    Points : 31
    Points
    31
    Par défaut
    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...

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    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:

    "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 : 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
    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

    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)
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2012
    Messages : 39
    Points : 31
    Points
    31
    Par défaut
    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 !

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 276
    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 276
    Points : 36 761
    Points
    36 761
    Par défaut
    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.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    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.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2012
    Messages : 39
    Points : 31
    Points
    31
    Par défaut
    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...

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

Discussions similaires

  1. Tableau VBA avec plusieurs contraintes
    Par Mondapar dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 26/05/2011, 23h23
  2. créer un tableau longtable avec plusieurs parties par page
    Par neferou dans le forum Editeurs / Outils
    Réponses: 0
    Dernier message: 04/09/2009, 19h25
  3. lecture d'un tableau uint8_t avec sscanf
    Par Mokhtar BEN MESSAOUD dans le forum Débuter
    Réponses: 8
    Dernier message: 15/04/2008, 18h55
  4. tableau croise avec plusieurs jeux de données
    Par ecayuno dans le forum BIRT
    Réponses: 1
    Dernier message: 09/08/2007, 15h03
  5. Lecture d'un fichier excel avec C++
    Par ziss dans le forum C++
    Réponses: 1
    Dernier message: 17/10/2006, 18h31

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