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 :

[Fichier] optimisation à l'ouverture


Sujet :

Langage C++

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

    Informations forums :
    Inscription : Juillet 2011
    Messages : 39
    Par défaut [Fichier] optimisation à l'ouverture
    Bonjour,
    Dans un programme que je suis amené à développer je dois passer par de gestion de fichier et je dois donc ouvrir et fermer des fichier un très grand nombre de fois(~1'000'000). Afin d'économiser du temps je souhaiterais optimiser ces traitements et connaitre les moyens les plus rapides de gérer les fichier.
    Actuellement j'utilise les fonction du c fopen et autres. je souhaiterais donc savoir si utiliser les flux avec ifstream ou ofstream me ferait gagner du temps ou si il existe une méthode plus rapide pour les gérer.
    Merci de votre aide.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Quel OS ?

    D'une manière générale la manipulation de fichiers est du ressort du système. À priori, quelle que soit la méthode utilisée, ça reviendra toujours à faire un appel système - c'est ça qui prend du temps.

    Donc tant que t'auras à ouvrir/fermer sans arrêt ces fichiers, il y a peu de chances que ça change en utilisant les flux...Tu dois vraiment travailler sur beaucoup de fichiers ou c'est simplement que l'ouverture/fermeture est mal placée (genre à l'intérieur de boucles) ?

  3. #3
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Que veux-tu faire :

    1 - ouvrir et fermer un même fichier plusieurs fois
    2 - ouvrir et fermer un par un plusieurs fichiers
    3 - les deux

    Dans tous les cas, dis-nous ce que tu cherches exactement à faire, peut-être que d'autres solutions existent sans que tu en soupçonnes l'existence. A part ça, les flux C++ ne sont pas plus rapides que ceux du C. Si tu veux vraiment gagner en vitesse, il faudra utiliser les fonctions de bas niveau de ton système (CreateFile & co. sous Windows, creat & co. sous linux, etc.) à la place des fonctions de haut niveau de ton langage (fopen & co. en C, iostreams en C++, etc.), mais ce n'est pas évident.

  4. #4
    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
    Je n’ai plus l’habitude des fonctions du c, mais fopen et consorts ne sont pas bufferisés, alors que les iostreams le sont, non ?

    Dans ce cas ça peut faire la différence (pour une utilisation « naïve » de ces méthodes).

  5. #5
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Ils sont tous les deux par défaut bufferisés. Le mode de bufferisation peut être modifié à l'aide de la fonction setvbuf en C et ios::rdbuf et/ou streambuf::pubsetbuf en C++.

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

    Informations forums :
    Inscription : Juillet 2011
    Messages : 39
    Par défaut
    Merci pour vos réponses j'ai effectivement réussi a fortement diminuer le nombre d'ouverture de fichier en ouvrant mes fichier au debut du programme puis en le faisant passer en paramètre entre mes différentes méthodes ce qui permet à mon programme de s'exécuter en un temps beaucoup moins important.
    Si il n'y a aucune méthode qui aille plus vite qu'un simple fopen je pense que le sujet est clos.

  7. #7
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 618
    Par défaut
    Salut,

    Il me semble que sous unix, utiliser open et des file descriptor est plus rapide que fopen et les FILE*. Dans un petit utilitaire de lecture/écriture d'un fichier dans un pipe, les perf avaient beaucoup augmentées rien qu'en remplaçant les fopen par des open...
    Par contre, comparé au stream C++ je ne sais pas.

  8. #8
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    *Peut être* pourrais tu également gagner pas mal de temps en repensant completement ton algorithme... :

    Au lieu de la séquence
    1. ouvrir le fichier
    2. lire / écrire une donnée dans le fichier
    3. fermer le fichier
    4. recommencer en (1)
    tu pourrais, par exemple, envisager de placer l'intégralité du contenu dans une collection d'objet "qui va bien" pour gérer les informations.

    tu en arriverais alors à une séquence de l'ordre de
    ajouter l'information à écrire dans une collection d'objet
    1. recommencer en (1)
    2. ouvrir le fichier
    3. écrire toutes les informations
    4. fermer le fichier


    ou de
    1. ouvrir le fichier
    2. lire l'information dans le fichier
    3. ajouter l'information à la collection
    4. recommencer en (2)
    5. fermer le fichier
    Il serait même, pourquoi pas, possible d'envisager de récupérer carrément l'intégralité du buffer du fichier ( cf la FAQ: Comment lire l'intégralité d'un fichier texte dans un buffer ?) dans la collection "qui va bien", de manière à limiter au mieux les acces disques.

    En effet, ce qui prend vraiment énormément de temps, ce sont les accès disques, car il faut en permanence attendre que les tetes de lecture se positionnent correctement, puis que le disque termine le tour qu'il vient de commencer, et, enfin, que le bus de données arrive à suivre pour l'envois des données lues / écrites
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

    Informations forums :
    Inscription : Juillet 2011
    Messages : 39
    Par défaut
    Salut,

    Il me semble que sous unix, utiliser open et des file descriptor est plus rapide que fopen et les FILE*. Dans un petit utilitaire de lecture/écriture d'un fichier dans un pipe, les perf avaient beaucoup augmentées rien qu'en remplaçant les fopen par des open...
    Par contre, comparé au stream C++ je ne sais pas.
    Je dois malheureusement travaillé sous xp donc pas de open mais merci quand même.

    Salut,

    *Peut être* pourrais tu également gagner pas mal de temps en repensant completement ton algorithme... :

    Au lieu de la séquence

    ouvrir le fichier
    lire / écrire une donnée dans le fichier
    fermer le fichier
    recommencer en (1)

    tu pourrais, par exemple, envisager de placer l'intégralité du contenu dans une collection d'objet "qui va bien" pour gérer les informations.

    tu en arriverais alors à une séquence de l'ordre de
    ajouter l'information à écrire dans une collection d'objet

    recommencer en (1)
    ouvrir le fichier
    écrire toutes les informations
    fermer le fichier


    ou de

    ouvrir le fichier
    lire l'information dans le fichier
    ajouter l'information à la collection
    recommencer en (2)
    fermer le fichier

    Il serait même, pourquoi pas, possible d'envisager de récupérer carrément l'intégralité du buffer du fichier ( cf la FAQ: Comment lire l'intégralité d'un fichier texte dans un buffer ?) dans la collection "qui va bien", de manière à limiter au mieux les acces disques.

    En effet, ce qui prend vraiment énormément de temps, ce sont les accès disques, car il faut en permanence attendre que les tetes de lecture se positionnent correctement, puis que le disque termine le tour qu'il vient de commencer, et, enfin, que le bus de données arrive à suivre pour l'envois des données lues / écrites
    J'ai utilisé ta 3e méthode et effectivement j'y ai nettement gagné en temps à l’exécution je mets 20 fois moins de temps(~5-10s vs 1min30) je vais maintenant tenter la lecture du fichier en global plutôt que caractère par caractère voir si je peut encore gagner 1 ou 2 seconde mais le temps d'exécution est déjà tout à fait acceptable.
    Merci pour tout.

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

Discussions similaires

  1. redirection de fichier et optimisation d'ouverture de session
    Par corwin44 dans le forum Windows Serveur
    Réponses: 1
    Dernier message: 10/10/2010, 20h48
  2. lire un fichier dès l'ouverture de mon editeur
    Par timboy11 dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 30/06/2008, 20h28
  3. Ouverture fichier et double ouverture
    Par guiguikawa dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 30/03/2007, 11h57
  4. Système de fichier (optimisation stockage)
    Par Mr Gumby dans le forum Administration système
    Réponses: 15
    Dernier message: 31/03/2006, 14h46
  5. Ecriture sur un fichier Word: Pb Ouverture
    Par drinkmilk dans le forum ASP
    Réponses: 2
    Dernier message: 11/06/2004, 09h48

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