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 Delphi Discussion :

Temps pour parser un fichier de + de 3 millions de lignes


Sujet :

Langage Delphi

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Août 2004
    Messages
    696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 696
    Points : 225
    Points
    225
    Par défaut Temps pour parser un fichier de + de 3 millions de lignes
    Bonjourn

    A votre avis combien de temps il faut pour parser un fichier de de 3 millions de ligne avec pour chaque parse une recherche si la valeur en cours n'a pas été enregistré dans un tlist (avec des pointeurs et des record)


    PS:
    Grace à cette méthode j'avais réussi à passer de 3 heures à 2 à 3 minutes pour un fichier de 58000 lignes par contre avec ce fameux fichiers je dépasse déja les 50 minutes avec 330000

    Merci

  2. #2
    Membre chevronné Avatar de chaplin
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 215
    Points : 1 819
    Points
    1 819
    Par défaut
    Découper ton fichier en des fichiers moins volumineux, c'est pas plus simple.

  3. #3
    Membre averti
    Inscrit en
    Novembre 2002
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 549
    Points : 436
    Points
    436
    Par défaut
    et passer par une database c'est pas plus simple ?
    PpPool

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Août 2004
    Messages
    696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 696
    Points : 225
    Points
    225
    Par défaut
    Bonjour et merci de vos réponses

    En fait j'ai déjà pensé à tout cela mais mon boss veut que tous soit fait en une seul fois avec un seul fichier

  5. #5
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut

    tu utilise quoi pour lire ton fichier ?

    ensuite utilise plutot une table de hashachage plutot qu'un tlist

    la recherche devient exponentielle dans un tlist ou alors
    creer un liste triée est fait une recherche dicothomique pour ameliorer les performance de recherche du Tlist

    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  6. #6
    Membre chevronné Avatar de chaplin
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 215
    Points : 1 819
    Points
    1 819
    Par défaut
    mon boss veut que tous soit fait en une seul fois avec un seul fichier
    Il te fournit le supercalculateur

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Août 2004
    Messages
    696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 696
    Points : 225
    Points
    225
    Par défaut
    absolument pas , il à repris mon code pour "améliorer les perf," je suis impatient de voir, le résultat.

    il jour le caicos avec ces connaissances, encore heureux cela fait plus de 10 ans qu'il est dans le domaine des télécom, mois cela fait tout juste un mois, avant mes connaissance se limitait à composer un numéro de téléphone et encore

  8. #8
    Membre chevronné Avatar de chaplin
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 215
    Points : 1 819
    Points
    1 819
    Par défaut
    Je suis curieux de connaître le résultat

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 455
    Points : 24 867
    Points
    24 867
    Par défaut
    Cela revient, souvent la lecture de gros fichiers, avec la gestion d'item ... tes pointeurs et des record sont complexes ? le critère d'indexation, c'est tout le record ou juste une clé (un ID, un mot-clé, ... ?) ... Anarpurna à raison, si tu finis avec 3 millions d'items, lol, rien que leur parcours d'une liste non trié prendra un temps fou !

    Si ton code est pas trop long, fournis le nous, on va l'optimiser, tu le sort à ton boss, et tu lui fait par exemple, tu fais le ReadLn (ou BlockRead à la mano) dans un Thread, et la recherche dans un autre, gain de temps garanti, mais c'est une optimisation à faire lorsque déjà l'algo est optimal car c'est une vraie gymnastique !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Août 2004
    Messages
    696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 696
    Points : 225
    Points
    225
    Par défaut
    merci à tous de vos réponse,

    En fait il a optimisé un peu mais rien de très transcendant, en fait il m'a dit cela hier au dernier moment qu'il voulais extraire que certains mvts et donc ajouter un critère supplémentaire sur les dates donc effectivement comme cela il fait un peut moins d'action et donc il est plus rapide et en enlèvement application.processmessage c'est un peu mieux, mais pas plus que ce que j'avais fait.


    Le problème c'est qu'il veut aller trop vite sans prendre le temps d'expliquer avec un peu plus de détails le monde des télécom, sans rien de formaliser par écris, tout en l'oral et allez voir l'oral, lui il beigne dans le monde des télécom depuis plus de 10 ans mois depuis tout juste 1 mois aujourd'hui, il n'a tellement pas le temps que les tests se font sur la base de production qui est en cours de conception, les données viennent de un peut partout sans être claire et homogène, en fait un peu le boxon, c'est cela le plus embêtant, mais enfin un peu de patience je finirais bien par lui faire comprendre qu'un travail correcte ne peut pas être fait dans la précipitation et sans réflexion, mais devise :
    perdre 1 jours aujourd'hui pour en gagner 10 demain

    Cependant je suis intéressé par cette notions de thread, avez vous un lien ou un exemple pour la gestion des thread

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Août 2004
    Messages
    696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 696
    Points : 225
    Points
    225
    Par défaut
    pour les thread j'ai trouvé :

    http://lberne.developpez.com/delphi/Proc-Thread/

    mais si vous en avez d'autres, je suis pour

  12. #12
    Membre chevronné Avatar de chaplin
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 215
    Points : 1 819
    Points
    1 819
    Par défaut
    Le fichier de 3 millions d'écriture occupe quel espace mémoire ?

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Août 2004
    Messages
    696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 696
    Points : 225
    Points
    225
    Par défaut
    si vous charger dans un StringListe comme j'ai essayé de le faire une fois, il prend autant de place que sa taille (soit + de 300 Mo ) si vous l'ouvrez avec textfile, readln, assign etc... pas grand chose pour ne pas dire rien

  14. #14
    Membre habitué Avatar de phplive
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 179
    Points : 150
    Points
    150
    Par défaut
    Bsr

    3 millions d'enregistrement non triés dans un fichier texte de 300Mo t'auras beau tourné le problème dans tous les sens tu vas devoir tout lire de façon séquentielle donc forcément ça va prendre un certain temps ... voir un temps certain



    cela fait plus de 10 ans qu'il est dans le domaine des télécom
    Dans les télécoms c'est possible mais dans l'informatique ça doit faire beaucoup moins longtemps que ça (ou alors beaucoup trop )... car je sais pas s'il est au courant mais on ne manipule plus d'aussi gros volume de données "à plat" depuis qu'on a inventé les bases de données (sauf éventuellement pour des migrations , backup et autres) surtout si on a besoin de trier , rechercher des enregistrements etc ...
    Ca en dit long sur le sérieux de la dite société de télécom
    Ce fichier csv il sort bien de quelque part non ?

    Sinon un petit test de chargement aléatoire de 3 000 000 de strings dans un TStringList (donc uniquement en mémoire sans lire aucun fichier) prend environ 3".
    Ca représente quand même la bataguelle de 300Mo de mémoire utilisés (Ne pas de faire ce genre de teste sur un serveur de prod )
    Ensuite trier ces 3 000 000 de lignes par ordre alphabétique demande environ 1 minute sur un P4 3GHz avec 1GO RAM sous XP
    Donc rien de trop méchant au final (hormis la consommation RAM allucinante) : maintenant reste à savoir ce que tu fais exactement au niveau de chaque enregistrement car là ça peut allonger méchamment les temps de traitement.
    @+
    Php

    D7 Enterprise - XP sp2
    The Truth is Out There

  15. #15
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 691
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 691
    Points : 13 121
    Points
    13 121
    Par défaut
    PhpLive a parfaitement résumé la situation.

    De plus, il n'est pas compliqué d'accéder à un serveur en ligne (même mutualisé) depuis Delphi pour optimiser les requêtes. C'est toujours mieux que de travailler sur un dump qui prendra lui-même déjà beaucoup de temps à être télécharger.
    (Mais ceci ne concerne pas la partie traitement. Donc c'est ton boss qui se fera tapper sur les doigts )

  16. #16
    Membre actif
    Profil pro
    Inscrit en
    Août 2004
    Messages
    696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 696
    Points : 225
    Points
    225
    Par défaut
    je vous fournirai un peu plus d'info demain

  17. #17
    Membre actif
    Profil pro
    Inscrit en
    Août 2004
    Messages
    696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 696
    Points : 225
    Points
    225
    Par défaut
    Salut,

    j'ai des nouvelles sur le pseudo algo de mon chef,

    certes il a de bonnes connaissances en pointeurs , quoi qu'utiliser des pointeurs en Delphi dernière génération je trouve cela peu utile avec ce qui existe comme composant (à mon humble avis), mais bon....

    Donc sur les 3 M de lignes sont algo marche lorsqu'il excluait certaines lignes ~+70%, mais maintenant on vient d'avoir un fichier avec plus de 1,3M de lignes dont aucune ne peut être exclu et la boum les temps sont catastrophiques.

    J'ai bien pensé avec travailler avec un clientdataset, j'importe toutes les lignes dans mon clientdataset et ensuite je travail sur cet objet comme s'il s'agissait d'une table (d'ailleurs un clientdataset s'est une sorte de table ?)

    Par contre comment faire un "select disctint colonne1, colonne2'.
    j'ai bien la propriété filtre, mais pour faire l'équivalent d'un select distinct je ne vois pas

    Revenons au problème,mon boss ne veux pas utiliser le clientDataset et il persiste à penser que cette lecture (comme s'il ne s'agissait que d'une lecture de fichier) peut durée moins de 2 minutes, car il n'y a pas que de la lecture, il y a aussi la recherche de toutes les lignes différentes et le stockages dans des structures pour ensuite la mise a jour d'une base de données

    en fait l'algo est comme suit:
    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
    1 - ouverture fichier
    2 - Lecture fichier 
    2 - 0 Lecture ligne - extraction de chaque colonne composant la ligne (fichier csv ";")
    2 - 1 - Occurence(1) de la ligne en cours
    Recherche si Occurence(1) existe dans un TLIST1
    Si existe je passe à l''occurence(2) 
    Si n''existe pas sauvegarde la data puis  je passe à l''occurence(2) 
    
    2 - 2 - Occurence(2) de la ligne en cours
    Recherche si Occurence(2) existe dans un TLIST2
    Si existe je passe à l''occurence(3)  
    si n''existe pas sauvegarde la data puis  je passe à l''occurence(3)   
    
    2 - 3 - idem à 1 et 2 sur 5 occurences supplémentaire
    
    3 - Je passe à la ligne suivantes tat que finfichier = false
    4 - Fermeture du fichier
    5 - Lecture des Tliste pour créer les requêtes d''insert en base
    6 - execution des requete par lots de 10 inserts ~800000 insert pour ce fichier
    que pensez-vous de cette méthode avez vous mieux ou bien avez vous une autre idée ?

  18. #18
    Membre habitué Avatar de phplive
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 179
    Points : 150
    Points
    150
    Par défaut
    Bjr

    Je ne vois pas trop à quoi correspond ce que tu appelles "occurrence(1), occurrence(2) ..."

    Si ton enregistrement se présente ainsi

    toto;20071001;20071006;93;9;00:00:00;23:59:59;0.16590000;AFGHANISTAN;
    Je suppose que tu le découpes en :
    [0] = toto
    [1] = 20071001
    [2] = 20071006
    [3] = 93
    [4] = 9
    [5] = 00:00:00
    [6] = 23:59:59
    [7] = 0.16590000
    [8] = AFGHANISTAN

    Et après tu en fais quoi ?


    Je pense que la difficulté provient du fait que tu mélanges à la fois une problèmatique de manipulation de données volumineuses (300 Mo) et de traitement.

    Pourquoi ne commences-tu pas par mettre ce gros fichier dans une table temporaire dans une base de données ? C'est fait pour

    Ensuite tu fais les traitements que tu veux dessus (tu auras un vrai dataset parfaitement opérationnel) et tu enregistres dans ta table définitive du SGBD



    Autrement en "pure" Delphi j'écrirais une classe spécifique dérivée de TList ou TStringList pour traiter ton problème en stockant chaque enregistrement dans un record
    @+
    Php

    D7 Enterprise - XP sp2
    The Truth is Out There

  19. #19
    Membre actif
    Profil pro
    Inscrit en
    Août 2004
    Messages
    696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 696
    Points : 225
    Points
    225
    Par défaut
    Salut,

    s'est exactement ce que je veux faire mais mon boss veux tout en même temps

    Concernant les occurences(1) occurences(2) la logique est exactement celle que tu as écris.

    J'ai bien fait un traitement par dataSet mais je comme l'ai écris depuis le début de ce post, il ne veut pas entendre de dataset ou de table temporaire, tout doit ce faire par lecture de fichier et pointeurs

    De toutes les façons , je ne m'entends pas du tout avec lui, un coup il me dit blanc un autre noir, ce que je lui propose une première fois ne lui plait pas et le lendemain il arrive la fleur au fusil en disant "j'ai une idée" et il me propose exactement ce que je luis proposais la veille, il veut aller trop vite, il veut bacler la travail et il me dit, on verra après ...

    Moi je ne suis pas habitué à travailler comme cela, soit on fait quelque chose et on prend le temps de réfléchir à comment on le fait ou on ne le fait pas


    Cela fait 1 mois et 5 jour que je suis arrivé dans cette boite, et dèjà il me gonfle alors je pense que je ne vais pas validé ma période d'essai.

    En tous le cas je vous remercie tous de vos conseils


    PS: j'ai aussi essayé les TLIST et les TSTRINGLIST
    Cordialement

  20. #20
    Membre chevronné Avatar de chaplin
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 215
    Points : 1 819
    Points
    1 819
    Par défaut
    De toutes les façons , je ne m'entends pas du tout avec lui, un coup il me dit blanc un autre noir, ce que je lui propose une première fois ne lui plait pas et le lendemain il arrive la fleur au fusil en disant "j'ai une idée" et il me propose exactement ce que je luis proposais la veille, il veut aller trop vite, il veut bacler la travail et il me dit, on verra après ...
    C'est minable comme comportement ! Il cherche à te faire craquer.
    Il te test pour voir ta patience et tes réactions. Je n'aime pas ces pratiques
    parce qu'elles te font perdre confiance. Va droit au but et demande lui ce
    qui l'attend réellement de toi. S'il sait, il n'a qu'à te montrer, il faut le prendre
    au mot.

    Qu'est ce qu'il y a dans TList1 et TList2, l'ennoncé n'est pas clair.

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

Discussions similaires

  1. [JDOM] Problème pour parser un fichier XML [débutant]
    Par adn013 dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 16/05/2007, 12h00
  2. fonction pour parser un fichier
    Par Dirty Harry dans le forum Langage
    Réponses: 7
    Dernier message: 30/01/2007, 05h13
  3. Réponses: 2
    Dernier message: 14/09/2006, 15h22
  4. problème pour parser un fichier xml avec XML::Simple
    Par black_code dans le forum Modules
    Réponses: 3
    Dernier message: 30/01/2006, 19h32
  5. [SAX] Probleme pour parser un fichier
    Par aymron dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 25/11/2005, 15h48

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