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 de lecture de lourds fichiers CSV


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Par défaut Optimisation de lecture de lourds fichiers CSV
    Bonjour,

    Je cherche à faire des traitements simples sur des fichiers CSV en C++, afin de gagner en rapidité par rapport aux macros VBA dont je dispose sous Excel.

    The tricky part : lesdits fichiers comportent des centaines de colonnes et des milliers de lignes. Il me faut donc un algo béton pour la lecture des CSV, et j'ai beau réfléchir (taille du buffer d'entrée, utilisation de tableaux ou fichiers intermédiaires...), je ne trouve pas "L'Idée" qui me permettrait de profiter de la puissance du C++ (la SL devrait jouer un bon rôle, mais où ? J'ai même pensé à la métaprogrammation, mais rien ne peut être optimisé à la compilation... J'étudie aussi les patrons en ce moment, pour voir...) pour réduire le temps de traitement de quelques heures à quelques minutes .

    Imaginons que je doive tout simplement sommer chaque colonne (toujours le plus rapidement possible). Comment fairiez-vous ?

    Merci d'avance.

    Cordialement,

    Kidpaddle2

  2. #2
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    la memoire eant plus rapide que le disque, lit tout ou partie de ton fichier dans un tableau et effecteu tes calculs dedans. Au pire,utilise un fichier mappé en mémoire (cf boost::filesystem et/ou boost::asio pour ça) que tu lis de manière asynchrone.

    Apres 100 colonnes x 1000 lignes, c'ets pas enorme hein.

  3. #3
    Membre éclairé Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Par défaut
    Merci de ta réponse. En fait je pensais plus à 70x70000, ce qui ferait 392Mo en mémoire... Une barette de RAM de 512Mo juste pour mon programme, je trouve cela quelque peu excessif... Et vive les dangers si les CSV sont des logs qui augmentent avec le temps !

    Bien sûr, les performances sont ma priorité, mais si je pouvais réduire l'utilisation mémoire en restant rapide, ça m'arrangerait.

    Une idée ?

    Edit: Et encore, c'est à supposer que j'arrive à stocker les cellules directement en double, sans passer par std::string... Donc sans compter les titres des colonnes et des lignes.

  4. #4
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    400 Mo c'ets je repete un peu rien. Je manipule des logs de 2+Go sans chercher à faire du vraiment optimisé. Je fais juste de la lecture asynchrone dans des fichiers mappés et ca passe tout seul.

  5. #5
    Membre éclairé Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Par défaut
    Merci de tes réponses rapides, c'est toujours plus sympa de converser à quelques minutes d'intervalle que quelques jours (voire rien).

    Bon... Après tout, si le programme est rapide l'utilisation mémoire ne devrait pas durer longtemps. Pourquoi pas ? Par contre, il faudrait vraiment que j'y gagne, parce que j'insiste que le coeur même de la qualité du programme réside en sa rapidité, peu importe la complexité (c'est pour moi d'abord, puis ma boîte).

    Et sinon, que penses-tu de lire par getline() dans un std::istream (quels sont les avantages de boost::istream par rapport au std:: ?) ? Je n'arrive pas à me rendre compte de la rapidité...

  6. #6
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Déjà, il faut voir le format de ton csv. Parce que getline n'est pas une bonne solution si le csv contient des sauts de ligne dans ses valeurs (ça existe).

    Ensuite, si tes calculs sont uniquement monolignes, tu peux te contenter d'avoir une seule ligne à la fois en mémoire.

    J'ai fait un bout de code en C++ qui fournit un template de parseur CSV (basé sur des traits, pour pouvoir parser des formats différents), je peux poster ça ce soir si ça t'intéresse.

    Sinon, puisqu'il s'agit d'une somme que tu veux faire, personnellement, j'aurais comme approche naïve de faire les sommes au fil de l'eau (c'est à dire, au fur et à mesure que tu avances dans le csv). Attention par contre, cette méthode est fortement sujette à des erreurs de calcul sur les flottants (ça peut être un problème comme ne pas l'être, tout dépend des valeurs et de l'erreur acceptable).

  7. #7
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    Citation Envoyé par kidpaddle2 Voir le message
    Et sinon, que penses-tu de lire par getline() dans un std::istream (quels sont les avantages de boost::istream par rapport au std:: ?) ? Je n'arrive pas à me rendre compte de la rapidité...
    Au dela de qqs Mo, je passe trjrs par des ficheirs mappés. Y a tt ce qui faut dans boost::iostreams

Discussions similaires

  1. Optimisation de lecture de gros fichier
    Par uriotcea dans le forum Windows
    Réponses: 3
    Dernier message: 23/11/2006, 19h00
  2. Linges sautées dans "lecture" d'un fichier .csv
    Par Mymi dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 10/08/2006, 20h02
  3. [Perf] Optimiser la lecture d'un fichier de taille > 2 m
    Par sacofan dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 22/07/2005, 13h25
  4. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 4
    Dernier message: 05/02/2003, 08h54
  5. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 2
    Dernier message: 11/06/2002, 10h24

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