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

Langage C++ Discussion :

Ecriture dans un fichier : optimisation


Sujet :

Langage C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 31
    Par défaut Ecriture dans un fichier : optimisation
    Bonjour,

    Tout d'abord je tiens a vous remercier a tous pour l'aide que vous fournissez à tous ceux qui comme moi posent des questions ici. J'ai déjà eu bien des fois les réponses à mes questions en parcourant le forum (ceci étant dit pour me faire bien voir )

    Il y a peu j'ai écrit un petit programme de simulation, qui me génère une importante quantité de texte en fonction des paramètres (rapidement de l'ordre de plusieurs centaines de mégas).
    Hormi l'optimisation des algorithme qu'il utilise, je bloque avant tout sur le moyen d'optimiser au maximum l'écriture dans mon fichier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     ofstream fichier2("log.txt", ios::out | std::ios_base::app);
     
        if(fichier2){
            fichier2 << "Nombre de morts trucs: " << nbMortsTotal << endl;
            fichier2 << "Nombre de machins : " << nbMortsFamineTotal << endl;
            fichier2.close();
        }
        else{
           //blabla d'erreur
        }
    L'ennui c'est qu'une portion de code comme celle ci appelée des milliers de fois me fait perdre un temps fou.
    Alors je pose la question : indépendamment de la beauté du code/lisibilité/facilité pour l'utilisateur, existe il une méthode qui gère les accès aux fichiers plus rapide ? (s'il vous plait, que personne ne me réponde de coder dans un langage plus bas niveau, comme de l'assembleur )
    J'ai trouvé plusieurs méthodes différentes pour lire et écrire dans des fichiers, mais aucune indication sur laquelle est la meilleure dans tels et tels cas.

    Si quelqu'un pouvait m'aider a avoir même un petit gain de temps, je lui en serait très reconnaissant.

    Merci d'avance

  2. #2
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 15
    Par défaut
    Sans avoir fait de recherches particulières, il me vient deux suggestions :
    - L'utilisation d'un fichier mappé en mémoire (mmap), pour éviter les temps d'entrée sortie, qui sont importants.
    - L'utilisation de vecteur d'écriture (writev)
    Je n'ai pas encore pu tester le gain que peut apporter ces deux méthodes. Par contre je ne sais pas si ces fonctions seront disponibles sur ton système.

  3. #3
    Membre expérimenté Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Par défaut
    - Garder le fichier ouvert plutôt que de le ré-ouvrir a chaque fois. (l'ouverture est très longue)
    - Si possible, ne pas formater les données sorties, et passer directement pas un filebuf.

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    En plus de garder le fichier ouvert, utiliser un buffer mémoire plus important que celui par défaut peut accélérer les choses. Par exemple tu travailles avec un ostringstream, et toutes les n lignes, tu vides ce flux dans ton ofstream.

    Sinon, après, tu as effectivement les fonctions spécifiques à ton OS, mais elles peuvent être plus complexes à utiliser. D'autant plus que les écritures les plus rapides sont souvent asynchrones.

    Si ton format de sortie est libre, tu peux aussi le modifier pour qu'il soit plus économe.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 31
    Par défaut
    Merci pour ces réponses, toutes intéressantes.
    J'ai supprimé effectivement les fermetures/réouvertures de fichier, et j'ai déjà constaté une amélioration de la rapidité.

    Je ne connais pas bien les nappages en mémoire, mais je vais me renseigner à ce sujet.

    En revanche j'avais déjà lut une ou deux indications quelque part concernant ostringstream, et après lecture de la doc, l'idée de m'en servir devient très tentante.

    Je vais donc tester tout ça de ce pas !

  6. #6
    Membre Expert
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Billets dans le blog
    1
    Par défaut
    Personnellement quand je dois écrire dans un fichier en boucle comme ça, je stock tout dans un std::string.Puis je l'envoi dans le fichier.
    N'utilisant pas ostream, je ne sais pas si il stock dans un buffer puis écris tout dans un fichier directement, donc ma solution peut ne servir à rien, comme le contraire .

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

Discussions similaires

  1. probleme d'ecriture dans un fichier texte
    Par azrael88370 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 24/01/2005, 17h33
  2. Script shell - écriture dans un fichier
    Par Leishmaniose dans le forum Linux
    Réponses: 6
    Dernier message: 13/12/2004, 22h48
  3. Probleme d'ecriture dans un fichier en mode Text
    Par bbozet dans le forum C++Builder
    Réponses: 3
    Dernier message: 14/01/2004, 13h46
  4. [LG]ecriture dans un fichier binaire
    Par jsaviola dans le forum Langage
    Réponses: 3
    Dernier message: 26/12/2003, 17h30
  5. Réponses: 2
    Dernier message: 26/09/2003, 14h51

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