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

Affichage des résultats du sondage: quelle méthode préférez vous pour écrire un fichier?

Votants
6. Vous ne pouvez pas participer à ce sondage.
  • Loadfromfile & SavetoFile de la tstringlist

    1 16,67%
  • Les classiques Rewrite, Reset, Append...

    5 83,33%
Delphi Discussion :

quelle est la meilleure méthode pour écrire dans un fichier texte?


Sujet :

Delphi

  1. #1
    Membre confirmé
    Avatar de korntex5
    Homme Profil pro
    Directeur technique
    Inscrit en
    Juin 2004
    Messages
    409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 409
    Points : 454
    Points
    454
    Billets dans le blog
    1
    Par défaut quelle est la meilleure méthode pour écrire dans un fichier texte?
    Je me demande quelle est la meilleure méthode pour lire et écrire dans un fichier texte, personellement j'utilise sans arrêt la métode du loadfromfile du tstringlist, simple et rapide, mais j'ai le cas en ce moment ou j'ai un très gros fichier texte à charger ajouter une ligne puis fermer assez frequemment, donc la méthode append ne serait elle pas plus rapide?
    Que la source soit avec moi!
    Jérôme JEAN-MARAULT

  2. #2
    Membre averti
    Profil pro
    xxxxxxxxxxx
    Inscrit en
    Juin 2004
    Messages
    308
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : xxxxxxxxxxx

    Informations forums :
    Inscription : Juin 2004
    Messages : 308
    Points : 407
    Points
    407
    Par défaut Fichier texte
    Peut-être utiliserais-je un TFileStream

  3. #3
    Membre confirmé
    Avatar de korntex5
    Homme Profil pro
    Directeur technique
    Inscrit en
    Juin 2004
    Messages
    409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 409
    Points : 454
    Points
    454
    Billets dans le blog
    1
    Par défaut
    quels en sont les avantages par rapport aux autres?
    Que la source soit avec moi!
    Jérôme JEAN-MARAULT

  4. #4
    Membre averti
    Profil pro
    xxxxxxxxxxx
    Inscrit en
    Juin 2004
    Messages
    308
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : xxxxxxxxxxx

    Informations forums :
    Inscription : Juin 2004
    Messages : 308
    Points : 407
    Points
    407
    Par défaut
    Peut-être d'autres contributeurs pourront être plus précis, mais il me semble que les flux s'appuient davantage sur les évolutions des Systèmes d'exploitation, alors que les TextFile sont les moyens d'accès "historiques" depuis MS-DOS...

  5. #5
    Membre confirmé
    Avatar de korntex5
    Homme Profil pro
    Directeur technique
    Inscrit en
    Juin 2004
    Messages
    409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 409
    Points : 454
    Points
    454
    Billets dans le blog
    1
    Par défaut
    Ce qui me semble interressant est de savoir quelle méthode ajoute la plus rapidement et avec le moins de consommation mémoire une ligne dans un fichier de plus en plus volumineux...
    Que la source soit avec moi!
    Jérôme JEAN-MARAULT

  6. #6
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Il me semble que le TFileStream ne charge pas le fichier en mémoire contrairement au TStringList.
    Donc dans le cas de gros fichiers , le TFileStream aura un gros avantage de temps sur un TStringList qui, lui, doit ouvrir puis sauvegarder les données.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 88
    Points : 101
    Points
    101
    Par défaut
    Bonjour,

    le mieux est de faire quelques tests chronométrés n fois (pour éviter l'interaction du cache) avec les 2 méthodes : filestream et append.

    Personnellement, sachant qu'il n'y a pas de lecture à faire, je pencherais vers le append... Mais ça n'engage que moi

  8. #8
    Membre confirmé
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    Points : 647
    Points
    647
    Par défaut
    Si c'est pour écrire une ligne à la fin du fichier, la bonne vieille méthode Append me parrait la plus appropriée. Un SaveToFile impose d'avoir chargé le fichier au préalable dans objet TStringList. Puis la méthode SaveToFile va réécrire complètement le fichier. Avec Append, le système déplace le pointeur à la fin du fichier et écrit seulement ce qui il y a à ajouter.
    Rien n'est moins sur que l'incertain : Pierre DAC

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 88
    Points : 101
    Points
    101
    Par défaut
    Re,

    voici un petit test :

    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
    procedure TForm1.Button1Click(Sender: TObject);
    var t,i : integer;
        f : TextFile;
    begin
         assignfile(f,'c:\tmp\test.txt');
         rewrite(f);
         closefile(f);
         for i:=1 to 1000000 do
         begin
              t:=gettickcount;
              append(f);
              writeln(f,'123456789abcdefghijklmnopqrstuvwxyz');
              closefile(f);
              label1.caption:=inttostr(gettickcount-t);
              application.processmessages;
         end;
    end;
    Avec un bouton, et un label pour afficher le temps mis pour écrire.

    Résultat : entre 0 et 32 ms pour ouvrir en append, écrire la ligne et fermer le fichier. C'est surement plus proche du 0 que du 32 à cause de l'imprecision de la fonction gettickcount.
    Ce résultat proche de 0 est valable quel que soit le nombre de lignes écrites dans le fichier. D'autre part, aucune ram supplémentaire n'est utilisée, ni swap non plus.

    [EDIT] J'ai refait le test avec une boucle interne : je trouve entre 0,15 ms et 2,5 ms, soit pouillème

  10. #10
    Membre confirmé
    Avatar de korntex5
    Homme Profil pro
    Directeur technique
    Inscrit en
    Juin 2004
    Messages
    409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 409
    Points : 454
    Points
    454
    Billets dans le blog
    1
    Par défaut
    très bon mais si tu fais le même test avec le filestream?
    Que la source soit avec moi!
    Jérôme JEAN-MARAULT

  11. #11
    Membre confirmé
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    Points : 647
    Points
    647
    Par défaut
    Tu peux simplifier le code et augmenter la vitesse.

    Tu fais ceci :
    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
    procedure TForm1.Button1Click(Sender: TObject);
    var t,i : integer;
        f : TextFile;
    begin
         assignfile(f,'c:\tmp\test.txt');
         rewrite(f);
         closefile(f);
         for i:=1 to 1000000 do
         begin
              t:=gettickcount;
              append(f);
              writeln(f,'123456789abcdefghijklmnopqrstuvwxyz');
              closefile(f);
              label1.caption:=inttostr(gettickcount-t);
              application.processmessages;
         end;
    end;
    C'est très bien, ça marche. L'écriture est réellement effectuée seulement après le CloseFile ou si le tampon disque est plein.
    Tu n'as pas besoin de répéter Append à chaque boucle.

    Append ouvre un fichier texte existant et place le pointeur à la fin du fichier, en écriture.

    Donc tu simplifis


    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
     
    procedure TForm1.Button1Click(Sender: TObject);
    var t,i : integer;
        f : TextFile;
    begin
         assignfile(f,'c:\tmp\test.txt');
         rewrite(f);
     
         for i:=1 to 1000000 do
         begin
              t:=gettickcount;
     
               writeln(f,'123456789abcdefghijklmnopqrstuvwxyz');
                label1.caption:=inttostr(gettickcount-t);
     
                //application.processmessages;
               // processmessage fait remonter tous les messages WINDOWS
              Label1.Refresh; // met à jour l'affichage de label1
         end;
       closefile(f);
    end;
    Rien n'est moins sur que l'incertain : Pierre DAC

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 88
    Points : 101
    Points
    101
    Par défaut
    > Phillipe Gormand

    C'était le but de ce test : simuler un append, une écriture et une fermeture x fois !!!

    mais j'ai le cas en ce moment ou j'ai un très gros fichier texte à charger ajouter une ligne puis fermer assez frequemment
    Pour l'optimisation, la méthode que tu préconises est évidemment la meilleure.

    > korntex5

    Je n'ai encore jamais utilisé de filestream : j'apprends et je te réponds !

  13. #13
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Salut
    Je pense que ce débat n'a pas lieu d'être...
    Le choix entre Append et les TStringList dépend de beaucoup de choses. Si tes fichiers sont gros, les TStringList sont désavantagées parce qu'elles chargent le fichier en complet.
    Par contre, si c'est pour quelques lignes, c'est quand même franchement plus pratique d'utiliser ces TStringList...
    Donc pour moi, il n'y a pas de meilleure méthode: chacune est meilleure que l'autre dans un domaine.
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  14. #14
    Membre confirmé
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    Points : 647
    Points
    647
    Par défaut
    OK ! Autant pour moi. Mais je ne vois pas la pertinance de ce test.
    Utiliser un TFileStream est séduisant, mais pas forcément plus rapide. Surement moins je pense. Car vont se succéder calcul de l'espace mémoire nécessaire, allocation de memoire pour l'objet TFileStream, écriture des donnée dans l'objet puis écriture sur le disque. L'interret d'un objet TFileStream est sont utilisation comme un fichier sur un disque virtuel. Donc son écriture physique sur un disque dur ou réseau, seulement après avoir terminé toutes les opérations. Si c'est pour écrire un fichier au fil-de-l'eau, autant utiliser les bonnes vielles méthodes.
    Rien n'est moins sur que l'incertain : Pierre DAC

  15. #15
    Membre éclairé Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Points : 789
    Points
    789
    Par défaut
    Citation Envoyé par Pedro
    Je pense que ce débat n'a pas lieu d'être...
    [...]
    ...chacune est meilleure que l'autre dans un domaine.
    Parfaitement d'accord!
    Et ça devrait d'ailleurs s'appliquer à beaucoup de sujets débatus sur ce forum.

    Il n'existe pas de meilleur langage, de meilleur algo ou de meilleurs composants généraux. Chaque outil possède ses forces et ses faiblesses et a généralement été conçu pour faire des tâches bien précises. Et c'est généralement là, lorsque l'outil est utilisé pour faire précisément ce pourquoi il a été conçu, qu'il est le meilleur.

    À mon avis, il ne s'agit pas de savoir quel sont les meilleurs outils mais de les connaître suffisament pour savoir lequel utiliser dans chaque situation. Je suis d'avis que ça fait partie des qualités que doit posséder un bon programmeur .
    -Slimjoe

  16. #16
    Membre confirmé
    Avatar de korntex5
    Homme Profil pro
    Directeur technique
    Inscrit en
    Juin 2004
    Messages
    409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 409
    Points : 454
    Points
    454
    Billets dans le blog
    1
    Par défaut
    je résume si j'ai bien compris:

    Tstringlist: pour manipuler plus facilement un fichier texte mais au dépend du temps de lecture et d'écriture du fichier, et de la mémoire.

    Tfilestream: pour écrire un fichier en mémoire de manière rapide en s'affranchissant des accès disques réguliers mais au dépend de la mémoire

    Classiques, Append,Reset,Rewrite:Le plus rapide pour écrire dans le fichier sans avoir a charger tout en mémoire. Mais difficile à manipuler.

    J'ai bon?
    Que la source soit avec moi!
    Jérôme JEAN-MARAULT

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 88
    Points : 101
    Points
    101
    Par défaut
    Je crois que c'est bien résumé sauf le dernier point :

    Mais difficile à manipuler.
    C'est ultra simplissime au contraire. Faut juste penser à ouvrir le bon fichier et fermer le bon fichier. C'est à la portée de tout le monde ici je crois.
    A la limite, tu fais une procédure du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    procedure EcritLigne(f:textfile;ligne:string);
    begin
           append(f);  <-- éventuellement tu ajoutes des contrôles
           writeln(f,ligne);
           closefile(f);
    end;
    et un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    assignfile (f,'fichier_toto');
    là où il faut
    et roule ma poule !

  18. #18
    Membre confirmé
    Avatar de korntex5
    Homme Profil pro
    Directeur technique
    Inscrit en
    Juin 2004
    Messages
    409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 409
    Points : 454
    Points
    454
    Billets dans le blog
    1
    Par défaut
    en fait lorsque je parle de manipuler c'est de pouvoir utiliser certains outils disponibles directement dans le tstringlist comme indexof, insert, count .... sans avoir a les redéployer.

    Mais merci a tous, même si certains s'offusquent toujous dès qu'il il a dans une discution le mot meilleur, ceci à aussi le mérite de démontrer qu'il n'ont pas totallement raison ni tord, du fais que certaines méthodes sont meilleures que d'autres suivant les cas, le but étant d'exposer ces cas...
    Que la source soit avec moi!
    Jérôme JEAN-MARAULT

  19. #19
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Citation Envoyé par korntex5
    Mais merci a tous, même si certains s'offusquent toujous dès qu'il il a dans une discution le mot meilleur, ceci à aussi le mérite de démontrer qu'il n'ont pas totallement raison ni tord, du fais que certaines méthodes sont meilleures que d'autres suivant les cas, le but étant d'exposer ces cas...
    Je ne m'offusque absolument pas.
    Comme tu le dis, il n'y a pas de meilleure méthode qu'une autre. Chaque méthode est adaptée à un cas de figure
    Pour moi, c'était juste le sondage qui n'avait pas sa place dans ce débat (fort intéressant au deumeurant)
    Et pour tout te dire, si j'en ai la possibilité, je préfère (de loin) utiliser les TStringList
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  20. #20
    Membre confirmé
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    Points : 647
    Points
    647
    Par défaut


    Tu as raison Pedro mais...
    Je n'ai pas vue le post comme un sondage. Le mot n'était pas approprié. Plutôt une recherche sur la meilleur méthode à utiliser pour faire ceci ou cela. Je crois que nous sommes tous d'accord pour dire qu'il n'y a pas la meilleure méthode même si le mot est souvent utilisé. J'ai justement voulu montrer qu'il faut cherché la méthode qui parrait la plus appropriée pour un besoin donné.

    Rien n'est moins sur que l'incertain : Pierre DAC

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Toutes versions] Quelle est la meilleure méthode pour alimenter un formulaire ?
    Par curt dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 06/09/2009, 13h41
  2. Réponses: 2
    Dernier message: 08/06/2009, 14h46
  3. Réponses: 3
    Dernier message: 21/01/2009, 22h47
  4. Réponses: 2
    Dernier message: 10/07/2008, 12h29
  5. [HTML] quelle est la meilleure méthode pour changer la langue d'un site?
    Par poupouille dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 18/02/2008, 12h17

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