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 :

Manipulation lourde de CSV : quelle approche choisir ?


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 94
    Par défaut Manipulation lourde de CSV : quelle approche choisir ?
    Bonjour à tous,

    Je chercher à modifier à la chaine plusieurs CSV qui ont tous plus ou moins la même forme, mais qui sont gros et surtout, que je veux fortement modifier.
    Avant de me lancer à coder, j'essaye d'imaginer la technique qui soit la plus pertinente et optimisée, sachant que je sens bien que vu la taille des CSV*et les manip demandées, ça va ramer sévère

    En gros, j'ai 2 types de modifications à faire pour chaque CSV :
    1. Parcourir le nom des colonnes;
    2. en fonction du nom de la colonne (en faisant appel à des regexps, puisque les noms sont des codes souvent faits sur le même modèle), décider si je mets cette colonne dans un fichier A, dans un fichier B, ou si je ne m'en sers pas ;
    3. En fonction du nom de cette colonne, définir des codes à lui associer dans des colonnes à créer. Par exemple, pour une colonne intitulée C15_H_0019, je veux créer 3 colonnes :*annee à remplir de valeur 15, sexe à remplir de valeur H, et code à remplir de valeur 0019 ;
    4. Enfin, ajouter les valeurs de ces 3 colonne à mon fichier A ou B (selon ce qui a été retenu en étape 1) en les ajoutant à la suite du fichier, pas en ajoutant des colonnes.


    Je ne sais pas si je suis très clair, mais en gros il s'agit de recoder et restructurer entièrement des fichiers de valeurs, en « copiant collant » des valeurs de colonnes à la suite des valeurs d'une colonne de valeurs unique, mais en y associant des codes en colonne pour pouvoir identifier d'où viennent ces valeurs et ce qu'elles signifient.
    Pour ceux qui font un peu de base de données décisionnel, c'est pour créer une table de fait et des clés pour des tables de dimension.

    Ça fait longtemps que j'ai pas remis les mains dans du python, et j'avais pas un très grand niveau non plus, surtout sur de la manipulation de strings et de csv, du coup je ne sais pas trop comment m'y prendre efficacement.
    Par exemple, est-ce que j'ai intérêt à faire ça en passant par du dictionnaire, pour plus facilement manipuler les valeurs de chaque colonne ?
    Est-ce que j'ai intérêt, pour chaque colonne, dès lors que je sais dans quel fichier output l'envoyer, à copier les valeurs uniques dans le fichier, puis dans ce fichier final à y écrire les codes associés dans les colonnes complémentaires, ou bien à déjà créer ces colonnes en mémoire ou dans le fichier initial puis à copier l'ensemble dans le fichier final ?

    Bref, je prends toutes les réflexions et bonnes idées !

    Merci.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    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 743
    Par défaut
    Salut,

    Citation Envoyé par GroFlo Voir le message
    je ne sais pas trop comment m'y prendre efficacement.
    La première chose à faire est d'avoir des exemples de noms de colonnes significatifs et un petit jeu de données: ce qui fait un tas de fichiers à tester dont vous pouvez anticiper le résultat attendu.

    Puis vous essayez de clarifier/traduire ce que vous racontez dans les étapes 1, 2 et 3 (pour commencer). Et si vous rencontrez des difficultés on saura mieux ce que vous cherchez à faire et vous pourrez poster le code que vous avez essayé.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Qu'est ce que vous appelez de gros CSV ? 1 million de données pour l'humain c'est gros. Pour votre ordi non. L'ordi a tout de même ses limites, mais pour savoir si vous allez les atteindre il faut le nombre de fichier et le nombre moyens de cellules par fichier (ou nombre de lignes fois nombre de colonnes)

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Avant de me lancer à coder, j'essaye d'imaginer la technique qui soit la plus pertinente et optimisée, sachant que je sens bien que vu la taille des CSV*et les manip demandées, ça va ramer sévère
    "Premature optimization is the root of all evil".

    Ce travail ne semble pas très compliqué à faire avec Pandas. Pourquoi tu te tenterais pas avec un fichier et voir combien de temps ça prend ? D'ailleurs, tu veux que ça se termine en combien de temps ? Si ça prendre 1 / 5 / 10 / 100 min c'est un problème ? Si ça ne convient pas, il sera temps de recoder une version optimisée.

    La remarque de lg_53 est très pertinente : c'est quoi "gros" ?

    Celle de wiztricks l'est tout autant : coder une version fonctionnelle avec un petit jeu de données. Ca évite d'attendre 3 minutes pour avoir un résultat faux, de modifier une ligne, attendre 3 minutes, etc.

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 94
    Par défaut
    Merci pour ces retours.

    Je parle de gros car on doit être dans les 5 à 6 millions de valeurs par fichier, sur 50 000 lignes, à remettre dans 2 fichiers séparés, qui du coup frôleront les 3 millions de lignes et 5 à 6 colonnes, et qu'il faut en traiter à la suite une bonne 10aine environ.
    Mais je risque de répéter l'opération sur d'autres familles de fichiers, tous aussi lourds, voir bien plus (notamment certains fichiers où on parle de 4 millions de lignes avec plus de 50 colonnes !)

    J'ai évidemment prévu de faire le test sur un fichier réduit, pour tester la logique (surtout que le travail se fait essentiellement sur les noms de colonnes, donc peu m'importe ensuite qu'il y ait 2000 lignes traitées ou 3 millions).

    Si au final, le traitement nécessite du temps, même de l'ordre de plusieurs heures, ce n'est pas un souci en soi. C'était juste que vu que ça me parait quand même être fastidieux, je préfère avoir une approche un minimum pensée pour éviter des erreurs au bout de 2h pour des problèmes mémoire ou que sais-je. Moi qui ai aussi l'habitude de faire de gros traitement carto, j'ai suffisamment soupé des opérations qui tournent pendant 45 minutes pour finir par planter

    Donc si avoir recours au dictionnaire pour lire le CSV plutôt qu'un reader classique fait plus ramer ou risquer de planter pour des questions de mémoire (je dis ça au hasard, j'en sais rien), je préfère le savoir avant de lancer l'opération sur mon premier fichier à 4 millions de valeurs !

    @Bktero : merci pour Pandas, j'ai effectivement vu entre temps ce package que je ne connaissais pas et qui me semble en effet une bonne base pour ça. Je m'y penche et, comme l'a proposé wiztricks je reviens ici avec un code test par étapes pour en discuter.
    Merci !

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    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 743
    Par défaut
    Salut,

    Citation Envoyé par GroFlo Voir le message
    C'était juste que vu que ça me parait quand même être fastidieux, je préfère avoir une approche un minimum pensée pour éviter des erreurs au bout de 2h pour des problèmes mémoire ou que sais-je.
    Quelque soit la taille du fichier CSV, c'est une suite de lignes inutile de tout charger en mémoire. Pour le reste pandas est très bien mais, vu ce que vous voulez faire, c'est un peu surdimensionné: vous allez passer du temps à éplucher la documentation alors que vous ne vous servirez que d'un millième des possibilités de la bête.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Citation Envoyé par GroFlo Voir le message
    Donc si avoir recours au dictionnaire pour lire le CSV plutôt qu'un reader classique fait plus ramer ou risquer de planter pour des questions de mémoire (je dis ça au hasard, j'en sais rien), je préfère le savoir avant de lancer l'opération sur mon premier fichier à 4 millions de valeurs !
    Programme ton traitement et teste le sur un fichier à 400 valeurs. Si ensuite ça plante pour 4 millions, même si ça met 45mn, c'est pas grave. Tu pourras optimiser à partir de là (peut-être par exemple ne pas stocker le fichier en mémoire mais dans un truc dédié aux big datas). L'important est d'abord d'avoir un traitement qui fonctionne. Le lieu de stockage du "Modèle" (tiré de la terminologie "Modèle/Vue/Controleur") pourra toujours être changé plus tard.


    Citation Envoyé par Bktero Voir le message
    La remarque de lg_53 est très pertinente : c'est quoi "gros" ?
    Ben c'est comme ma t...


    PS: merci pour ton lien Pandas. je suis en train de lire la doc...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Dans les temps de traitement, il est probable que ce soient les lectures/écritures disque qui pèseront le plus lourd. Il est donc important (et facile!), de faire une simulation.

    J'ai ainsi fabriqué et relu un fichier csv de 1 million de lignes, chaque ligne ayant 15 champs comportant chaines, nombres entiers et nombres flottants.
    - temps d'écriture: 5 secondes
    - temps de lecture: 3 secondes

    Et on dit que Python est lent?

    Compte tenu du travail à faire, si le traitement porte sur chaque ligne séparément, je pense qu'il faut prévoir une lecture ligne par ligne (une fonction de lecture avec yield par exemple), suivi du traitement, et suivi d'une écriture également ligne par ligne.
    Pour l'écriture dans plusieurs fichiers, il n'y a pas d’inconvénient à les laisser ouverts pendant le traitement (les systèmes d'exploitation actuels permettent d'ouvrir environ 500 fichiers en même temps).

    Chaque ligne lue dans le fichier csv est une liste de valeur de champ => ["toto", 123, 0.987, ...]. et c'est une telle liste après traitement qu'il faut écrire dans le bon fichier csv destination. Le code de lecture et d'écriture sera facile à développer puisqu'il existe des exemples dans le manuel (module csv). Autrement dit, le vrai problème de codage va être dans la manipulation de ces listes.

Discussions similaires

  1. Quelle méthode choisir ? MySql, CSV,PHP
    Par redvivi dans le forum Linux
    Réponses: 1
    Dernier message: 25/12/2006, 18h38
  2. Premier langage web : quelle langage choisir ???
    Par skeeper dans le forum Débuter
    Réponses: 4
    Dernier message: 06/03/2005, 14h38
  3. [Strategie]arborescence : quelle structure choisir ?
    Par iubito dans le forum Général Java
    Réponses: 12
    Dernier message: 20/09/2004, 14h46
  4. Quelle licence choisir pour cette application ?
    Par krusaf dans le forum Licences
    Réponses: 6
    Dernier message: 08/07/2004, 20h20
  5. [Intranet] Quelle solution choisir ?
    Par stailer dans le forum Développement
    Réponses: 6
    Dernier message: 06/09/2003, 01h17

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