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

MFC Discussion :

Rapidité de parcours d'un fichier


Sujet :

MFC

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 96
    Par défaut Rapidité de parcours d'un fichier
    Bonjour,

    Je dispose d'une fonction qui doit parcourir un fichier se composant de différents blocs de lignes de textes, délimités par les chaînes de caractères "DEBUT" et "FIN", comme ceci :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DEBUT
    // Données
    FIN
    DEBUT
    // Données
    FIN
    [...]
    La fonction est appelée, elle ouvre le fichier, et lorsqu'un bloc est trouvé, elle effectue quelques traitement puis s'arrête : elle est donc appelée autant de fois qu'il y a de blocs de données.
    J'ai inclus dans le code le fait qu'à chaque bloc, je sauvegarde la position de l'offset en lecture dans le fichier dans une variable ULONGLONG, avant de retourner ce dont j'ai besoin (j'utilise la classe CStdioFile pour gérer le parcours). Lors d'un appel ultérieur de la fonction, le fichier sera ouvert à la position donnée à la fin de la lecture du bloc précédent.

    Je suis passé par ce système puisqu'auparavant, le fichier était toujours parcouru depuis le début, ce qui rendait l'application assez lente. Le fichier était alors géré avec des pointeurs FILE * et le parcours se faisait via les fonction fscanf(), gets().

    Le problème est que je me retrouve avec une fonction encore plus lente qu'auparavant.

    Connaitriez-vous un moyen d'optimiser ce parcours ?
    Merci par avance.

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Peux-tu montrer ta fonction de lecture ?
    Es-tu sûr que le problème soit bien là ?

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 442
    Par défaut
    Pourquoi ouvrir plusieurs fois le même fichier ?

    La lecture séquentielle de bloc de 8Ko devrait être optimal avec l'utilisation automatiques des différents caches (cache disque, cache OS, cache applicatifs.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 96
    Par défaut
    En fait, j'utilise le parcours du fichier pour une fonction d'ouverture de documents. Les commandes récupérées sont ensuite traitées et exécutées graphiquement.
    En testant deux parcours différents, l'un avec CStdioFile et des méthodes de sauvegardes de position de l'offset spécifiques, l'autre avec des FILE * et des méthodes de sauvegardes de position de l'offset spécifiques, encore une fois, je me suis aperçu que le parcours était bien plus rapide avec la seconde méthode.

  5. #5
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    je suis étonné que l'api C soit plus rapide que CStdioFile,
    CStdioFile travaille directement avec les api 32 (comme CFile) ,il n'y a pas plus directe (sauf l'api 32).
    suivant la taille du fichier il vaut mieux le lire d'un seul bloc dans une CString par exemple et effectuer les recherches directement dedans ça ira plus vite..

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 96
    Par défaut
    Citation Envoyé par farscape Voir le message
    salut,
    suivant la taille du fichier il vaut mieux le lire d'un seul bloc dans une CString par exemple et effectuer les recherches directement dedans ça ira plus vite..
    Je travaille avec des fichiers qui ont une taille égale à plusieurs dizaines de MO.
    Si jamais ça n'avait pas été le cas, tu penses que travailler sur un objet CString au lieu d'un fichier, en sachant que chaque action sur l'objet sera un appel de méthode CString pourrait être plus rapide ?

    Concernant la rapidité du parcours :
    Je pense qu'en fait ce qui est plus long avec CStdioFile c'est le repositionnement de l'offset du fichier.

  7. #7
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    travailler en mémoire directement ira toujours plus vite que dans un fichier.
    en ce qui concerne le positionnement que ce soit l'api c ou CStdioFile les deux appels l'api 32 .
    il doit y avoir une autre raison.
    tu peux aussi agrandir le cache mémoire alloué au stream de l'objet avec un Setvbuf:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    setvbuf(m_pStudioFile->m_pStream, NULL, _IOFBF,MEMORYALLOC);

Discussions similaires

  1. Parcours d'un fichier et insertion dans une base de données !
    Par condor_01 dans le forum Général Java
    Réponses: 2
    Dernier message: 24/04/2008, 09h24
  2. Parcours d'un fichier selon plusieurs crièteres
    Par RR instinct dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 21/07/2006, 15h25
  3. Parcours d'un fichier
    Par vallica dans le forum Langage
    Réponses: 1
    Dernier message: 27/06/2006, 22h08
  4. Parcours d'un fichier CSV
    Par Premium dans le forum C
    Réponses: 2
    Dernier message: 29/05/2006, 00h01

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