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 :

Nombre de lignes dans un fichier


Sujet :

C

  1. #21
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    J'ai une question pour fearyourself : as-tu utilisé fread au lieu de fgets pour une raison particulière ?

    Etant donné qu'il s'agit de donné de type "Texte", fgets me parrait plus approprié, mais peut-être moins rapide ?
    K

  2. #22
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par KiLVaiDeN
    J'ai une question pour fearyourself : as-tu utilisé fread au lieu de fgets pour une raison particulière ?

    Etant donné qu'il s'agit de donné de type "Texte", fgets me parrait plus approprié, mais peut-être moins rapide ?
    Avec fread je peux lui dire de lire 4k par 4k or fgets s'arrête à chaque ligne. Donc de toute façon, avec fgets on est perdant vu qu'il y a un vérificateur de caractères dans la fonction (pour s'arrêter à la fin de la ligne...)...

    Le fait que ce soit du texte ne veut pas dire qu'on ne peut pas utiliser fread...

    Jc

  3. #23
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par fearyourself
    Donc pour le moment tu es plus lent Emmanuel.
    Hum. Fait le test 2 fois de suite pour voir ? Je me méfie des caches...
    Idem avec les autres codes...

    Pour le tien, il devrait être encore plus efficace avec une taille de BUFSIZ.
    Pas de Wi-Fi à la maison : CPL

  4. #24
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Attention quand meme a ce genre de test. Le facteur limitant est l'acces disque, qui n'est pas deterministe (il depend des acces demandes par d'autres applications). Il faut faire des moyennes.

  5. #25
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Merci pour l'info fearyourself Je comprend mieux pourquoi fread est plus rapide ^^
    K

  6. #26
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par DaZumba
    Attention quand meme a ce genre de test. Le facteur limitant est l'acces disque, qui n'est pas deterministe (il depend des acces demandes par d'autres applications). Il faut faire des moyennes.
    J'ai fait les tests 10 fois pour chaque version avant de donner les résultats (je suis aussi méfiant! )

    Les temps changent mais l'ordre de grandeur est toujours le même...

    Ma version: 0.2
    Emmanuel: 1.2
    fgets: 2.4

    Hum. Fait le test 2 fois de suite pour voir ? Je me méfie des caches...
    Idem avec les autres codes...
    Voir ci-dessus

    Testez sur vos machines , on verra si ça fonctionne avec d'autres disques
    Jc

  7. #27
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Question pour fearyourself : par curiosité, si dans tes tests tu testais la différence plutot que l'inégalité ?

    Peut-être que ça irait encore plus vite...
    K

  8. #28
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par fearyourself
    Testez sur vos machines , on verra si ça fonctionne avec d'autres disques
    Ou d'autres systèmes...
    Pas de Wi-Fi à la maison : CPL

  9. #29
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 163
    Points : 115
    Points
    115
    Par défaut
    Ce qui est important pour moi c'est le temp oui, quelque chose de portable. Sinon, pas de longueur fixe pour les enregistrements.
    En gros du total inconnu a par la forme de l'enregsitrement.
    Vive le C => Quoique pas sympa pour la mémoire de mon PC.

    Seul le chat le savait!!!!

    De la rigueur en programmation est maître mot!!!

  10. #30
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par fearyourself
    Les temps changent mais l'ordre de grandeur est toujours le même...

    Ma version: 0.2
    Et avec BUFSIZ à la place de 4096 ?
    Pas de Wi-Fi à la maison : CPL

  11. #31
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 163
    Points : 115
    Points
    115
    Par défaut
    Moi mon, fichier test fait juste 5,52 go
    Vive le C => Quoique pas sympa pour la mémoire de mon PC.

    Seul le chat le savait!!!!

    De la rigueur en programmation est maître mot!!!

  12. #32
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        while ( (size = fread(buf, 1, N, f)) > 0) {
            char* start = buf;
            char* end;
            while ( (end = memchr(start, '\n', size)) != NULL) {
                size -= (end-start) + 1;
                start = end+1;
                cnt++;
            }
        }
    devrait etre legerement mieux, du moins si memchr est correctement implemente.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  13. #33
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Et avec BUFSIZ à la place de 4096 ?
    Même temps, 0.2
    devrait etre legerement mieux, du moins si memchr est correctement implemente.
    0.5 avec ton implémentation

    Moi mon, fichier test fait juste 5,52 go
    Je vais faire les tests sur ma machine avec un fichier de 5.52 Go, on verra ce que ça donne

    A suivre...

    Jc

  14. #34
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    fearyourself : Je n'ai pas de compilo C ici, peux-tu juste me dire la vitesse de ça ? ( ton code un peu modifié )

    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
    22
    23
    24
    25
    26
    27
    #include <stdlib.h>
    #include <stdio.h>
     
    #define N 4096
     
    int main(int argc, char **argv)
    {
            char buf[N];
            int i,size;
            int cnt=0;
     
            if(argc!=2)
                    return 1;
     
            FILE *f = fopen(argv[1],"r");
     
            if(f==NULL)
                    return 1;
     
            while((size=fread(buf,1,N,f))!=0)
                    for(i=0;i!=size;i++)
                            if(buf[i]=='\n')
                                    cnt++;
            fclose(f);
            printf("Lignes: %d\n",cnt);
            return 0;
    }
    Juste par curiosité !
    K

  15. #35
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Ok, j'ai limité le fichier à 1 gig avec 37996448 lignes...

    J'ai pris 1Go pour gardé le temps relativement bas...

    Voici les résultats, 3 exécutions pour vérifier que les résultats sont pareils...

    Ma version avec BUFSIZ:

    Lignes: 37996448

    real 1m50.907s
    user 0m3.357s
    sys 0m1.111s
    Version d'Emmanuel:

    37996448 lines

    real 1m53.072s
    user 0m22.407s
    sys 0m1.623s
    Donc même temps global par contre, temps user c'est catastrophique... L'attente des appels doit se cacher par le temps accès disque...

    La version fgest utilisant aussi BUFSIZ comme taille maximale:
    Lignes: 37996449

    real 1m50.811s
    user 0m8.579s
    sys 0m1.218s
    Version de Jean-Marc:
    Lignes: 37996448

    real 1m54.894s
    user 0m2.527s
    sys 0m1.148s
    Donc plus lent sur real mais pareil que moi sur user... Reste une version...

    Version de KiLVaiDeN:
    Lignes: 37996448

    real 1m52.317s
    user 0m2.940s
    sys 0m1.146s
    Donc presque pareil... Finalement, on voit que sur un grand fichier, toutes les versions se ressemblent dans le temps total mais pas le temps user.

    Par contre, comment tu fais pour faire tourner sur un fichier de 5go une version en 2-3 minutes? Moi je pensais avoir un ordi correct mais si j'interpole j'arrive à 10m minimum...

    Voili voilou,
    Jc

  16. #36
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Hum pas mal comme test, tu utilise quoi pour le chrono, ca pourrais m'être utile en cas de besoin d'optimisation pour les test
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  17. #37
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 163
    Points : 115
    Points
    115
    Par défaut
    Avec un while(fgets()).
    Mon fichier fait 11 800 000 lignes pour 5.52 GO
    Et comme je trouvais que mes 2 à 3 minutes était longue, je profite de mon fgets pour executer un premier traitement juste comparatif et du coup il met 4 minutes.

    Sinon, je ne sais pas la config du PC. Comme c'est le PC du taff, tout du moins de mon stage.
    Vive le C => Quoique pas sympa pour la mémoire de mon PC.

    Seul le chat le savait!!!!

    De la rigueur en programmation est maître mot!!!

  18. #38
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Il y a un intru dans tes tests, qui retourne un mauvais nombre de lignes
    K

  19. #39
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par KiLVaiDeN
    Il y a un intru dans tes tests, qui retourne un mauvais nombre de lignes
    Nan, en fait l'intru est le seul qui rend le bon nombre, problème de nombre de bout de bois et de piquets dans un jardin...

    Nos versions comptes les '\n', fgets compte les lignes...

    Jc

  20. #40
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Une question me turlupine : pourquoi compter les lignes ?

    Je ne vois pas forcément l'interêt, si il s'agit d'un fichier sur lequel tu vas faire un traitement, je pense qu'il vaudrait mieux que tu fasses une structure de fichier un peu plus puissante, avec plus d'informations.

    Je dis ça au posteur initial hein!

    A+ et en tout cas merci pour les tests, c'était interessant
    K

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. Calcul du nombre de lignes dans un fichier texte en JavaScript
    Par developppez dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 29/08/2017, 08h13
  2. nombre de lignes dans un fichier .txt
    Par marieo dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 31/10/2007, 15h22
  3. Compter le nombre de ligne dans un fichier
    Par amine_en_france dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 31/05/2007, 17h19
  4. [Fichier] Nombre de ligne dans un fichier texte
    Par NewSer dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 10/11/2004, 16h58
  5. Réponses: 2
    Dernier message: 02/03/2004, 19h38

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