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

C++ Discussion :

Optimisation lire un fichier CSV, le séparateur est un ;


Sujet :

C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 310
    Points : 157
    Points
    157
    Par défaut Optimisation lire un fichier CSV, le séparateur est un ;
    Bonjour à tous.

    Je travail dans environnement Windows.
    J'effectue actuellement des essais pour une lecture d'un fichier CSV (476mo) avec comme séparateur un ; (point virgule).

    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
    19
    20
    21
    22
    23
     
    std::ifstream fichier( "c:/test.csv" );
     
        if ( fichier ) // ce test échoue si le fichier n'est pas ouvert
        {
            std::string ligne; // variable contenant chaque ligne lue
     
            // cette boucle s'arrête dès qu'une erreur de lecture survient
            while ( std::getline( fichier, ligne ) )
            {
                // afficher la ligne à l'écran
              istringstream iss( ligne );
    			string mot;
    			while ( std::getline( iss, mot, ';' ) )
    			{
    				if (mot=="test")
    					mot = "test";
    				else
    					mot = "bouh";
    			}
     
            }
        }
    Ca met pas loin de 3/4 d'heure pour effectuer ce bout de code.
    l'équivalent en C# met 40 secondes

    Pourquoi une telle différence ? (ou se situe t-elle ?)
    Comment optimiser.

    pour ceux qui n'auraient pas compris, je lit le fichier ligne par ligne, je split la ligne par le ; puis je fais une condition sur chaque partie du split.
    (c'est un truc bidon histoire de)

    Merci pour votre aide.

  2. #2
    Membre averti Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Points : 412
    Points
    412
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (mot=="test") mot = "test";
    Déja ca sert pas a grand chose de faire ca...

    Ensuite Essai de regarder la partie du code qui est la plus longue a s'executée Lecture / Traitement.

    Pour la lecture, peut etre qu'une lecture dans un plus gros buffer serais plus rapide qu'une multitude de petits acces.
    J'aime pas les épinards... Mais alors pas du tout

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 310
    Points : 157
    Points
    157
    Par défaut
    la condition est totalement inutile c'est évident, mais c'était juste histoire de

    La plus longue c'est bien évidemment la boucle pour splitter la ligne. Je n'ai pas trouvé autre chose pour splitter une chaine par un séparateur.

  4. #4
    Membre averti Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Points : 412
    Points
    412
    Par défaut
    Citation Envoyé par SoaB
    la condition est totalement inutile c'est évident, mais c'était juste histoire de

    La plus longue c'est bien évidemment la boucle pour splitter la ligne. Je n'ai pas trouvé autre chose pour splitter une chaine par un séparateur.
    Est ce que ce n'est pas plus rapide de rechercher le caractere ; dans ta chaine et de faire des substrings ?
    J'aime pas les épinards... Mais alors pas du tout

  5. #5
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 749
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 749
    Points : 10 666
    Points
    10 666
    Billets dans le blog
    3
    Par défaut
    Si c'est pour lire des mots séparés par un ';', tu peux fusionner les 2 getline.
    Mais le code de la FAQ que tu as repris sert à dépanner. Des liens vers des solutions plus performantes sont donnés.

  6. #6
    Membre habitué
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Points : 186
    Points
    186
    Par défaut
    Personnellement, pour faire ce genre de traintement j'utilise "tokenizer" de boost...

    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
    19
     
      ...
      #include <boost/tokenizer.hpp>
      ...
     
      // Choix du separateur :
      char_separator<char> sep(";");
      // Parsing :
      typedef tokenizer< char_separator<char> > tokenizer;
      tokenizer tokens(les_datas_a_parser, sep);
     
      // C'est l'objet "tokens" qui contient les données parsées :
      for(tokenizer::iterator tok_iter = tokens.begin();
          tok_iter != tokens.end();
          ++tok_iter)
      {
        // Traitement sur les données :
        tab_truc.push_back(*tok_iter); // Par exemple
      }
    ¨
    Par contre je ne sais pas ce que ça donne niveau perf...
    Plus y'a d'Gruyère, plus y'a d'trous !
    Plus y'a d'trous, moins y'a d'Gruyère...
    Donc, Plus y'a d'Gruyère, moins y'a d'Gruyère !!!

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 310
    Points : 157
    Points
    157
    Par défaut
    On va rester sur C#, je pensais que C/C++ allait permettre d'avoir des bonnes performances d'entrée de jeu mais en fait non. Puis trop la galère après pour faire les autres traitements (entre autre accès à une BdD).

    Donc C# est très performant apparemment donc ca suffira bien.

    merci bien à tous.

  8. #8
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    ce qui est le plus "gourmand" en terme de durée ce sont les Entrée/Sortie vers le disque dur, dans ton cas la lecture via std::getline( fichier, ligne )

    en lisant par (gros) buffer et non par ligne tu gagneras du temps
    il y a du linge sur la corde à linge

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 310
    Points : 157
    Points
    157
    Par défaut
    euh comment expliques tu la différence entre C# et C++ alors ? Car ca fait la même chose il me semble derrière.

  10. #10
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Ce n'est pas forcément la même chose, il y a peut-être un buffer plus important pour le C#

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 310
    Points : 157
    Points
    157
    Par défaut
    Comment peut on changer ce buffer ?

  12. #12
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 749
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 749
    Points : 10 666
    Points
    10 666
    Billets dans le blog
    3
    Par défaut
    Tu as compilé en release ?

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 310
    Points : 157
    Points
    157
    Par défaut
    oui

Discussions similaires

  1. Réponses: 11
    Dernier message: 07/10/2011, 09h19
  2. Comment lire les fichiers dont l'extension est .tex ?
    Par condor_01 dans le forum Ubuntu
    Réponses: 3
    Dernier message: 19/10/2007, 16h24
  3. Ouvrir et lire un fichier .csv
    Par Art19 dans le forum Composants VCL
    Réponses: 20
    Dernier message: 12/08/2007, 23h18
  4. Lire un fichier CSV ou XLS de la même manière
    Par Linio dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 18/07/2007, 15h12
  5. Lire un fichier CSV/XLS
    Par Doneve dans le forum ASP
    Réponses: 3
    Dernier message: 04/10/2005, 17h34

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