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 d'exécution TList et TStringList


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 d'exécution TList et TStringList
    Bonjour,

    Je voudrais connaître les différences en terme d'execution (délai) dans les traitement impliquant les Tlist et les TStringList.

    En fait mon bosse me pet les .... il affirme que le traitement de comparaison de plus de 58000 lignes (ligne pas ligne) prend 2 minutes avec les Tlists,
    j'ai essayé avec les tlist et cela ne prends pas pas 2 minutes peut dans l'espace temps des boss mais pas dans le mien

    je vous explique le traitement :

    1- Je recherche toutes les occurences de destination dans ce fameux fichier de 58000 lignes ==> en ressort 633 occurs différentes ==> moins de 10 secondes
    2- Je recherche pour chacunes de ces 633 occurs d'autres informations dans ce fichier de 58000 lignes, à raison de 18 secondes de traitement pour chaque occurs (parcours des 58000 pour vérifier s'il n'y as pas de doublons) ==> ~3 heures

    PS/ effectivement il y a un delta avec l'utilisation de TstringList je passe de 18 à 25 secondes, rien de très transcendant.

    Est ce que cela est pour vous normal ?

    auriez vous une idée pour améliorer le temps

    Merci

  2. #2
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 289
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 289
    Points : 1 940
    Points
    1 940
    Par défaut
    Est-ce que les lists sont triées?

  3. #3
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 871
    Points : 11 361
    Points
    11 361
    Billets dans le blog
    6
    Par défaut
    est-il possible d'envisager de trier les lignes alphabétiquement et de charger le StringList avec DupIgnore pour éliminer les doublons ?

  4. #4
    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

    D'accord avec les réponses précédentes à 100%

    TList ou TStringList c'est pratiquement la même chose côté perf. Avec un léger avantage à la TList puisqu'elle ne manipule que des pointeurs.
    Maintenant ce qui influence les listes c'est la nature des éléments qu'elles contiennentt ! Crois moi j'ai sais quelque chose

    Pour ton traitement 3 heures cela me semble démesurer


    As-tu pensé à faire un mettre la propriété de la Sorted de la TStringlist à True et à définir une procédure de tri personnalisée ?

    Ainsi lorsque tu insères tes 58 0000 lignes ta liste filtre automatiquement et elle ne contient que tes 633 sans rien faire !

    Ensuite tu traites ta liste de 633 occurrences pour faire les traitements que tu veux.

    A mon avis tu vas passer de 3heures à moins d'une demi heure voir moins ou alors c'est que chacune de tes lignes est vraiment très volumineuse et que le critère de tri n'est pas situé à un emplacement fixe dans chaque chaîne (le pire des cas )

  5. #5
    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
    En fait il s'agit d'un fichier CSV et je dois extraire certaines informations et faire le trie sur chacune de ces 58000 lignes

  6. #6
    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 suis passé sur une autre machine et j'ai divisé le temps par 3 ==> 72 minutes de traitements
    c'est déja mieux

  7. #7
    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
    72 minutes de traitements
    c'est déja mieux
    Ouais enfin pour 58 000 enreg c'est pas non plus terrible

    Il fait quelle taille ton fichier CSV ?

    As-tu essayé en appliquant une procédure de tri personnalisée ?

  8. #8
    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
    ouhais ouhais je sais c'est pas térrible mais c'est tjrs mieux que 3 heures

    voila la tête de mon fichier CSV

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    toto;20071001;20071006;93;9;00:00:00;23:59:59;0.16590000;AFGHANISTAN;
    toto;20071001;20071006;9370;9;00:00:00;23:59:59;0.15319700;AFGHANISTAN GSM;
    toto;20071001;20071006;9375;9;00:00:00;23:59:59;0.15319700;AFGHANISTAN 
    toto;20071001;20071006;3554;9;00:00:00;23:59:59;0.02211300;ALBANIE TIRANA;
    toto;20071001;20071006;213;9;00:00:00;23:59:59;0.09500000;ALGERIA;
    toto;20071001;20071006;21321;9;00:00:00;23:59:59;0.09500000;ALGERIA ALGER;
    toto;20071001;20071006;2131;9;00:00:00;23:59:59;0.10659000;ALGERIA CAT;

  9. #9
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Bonjour,

    A propos de :
    ... parcours des 58000 pour vérifier s'il n'y as pas de doublons) ==> ~3 heures
    ... Pour la supression des doublons tu peux jeter un oeil ici :
    http://www.developpez.net/forums/d44...te-rapidement/
    ... où tu trouveras un bout de code et les tésultats de tests comparatifs de vitesse d'exécution.

    A+

  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
    en fait l'algo est le suivant :
    1- recherche pays
    2- Recherche de toutes les occurrences avec le pays recherche en 1, pour cela je parcours la liste de 58000 occurrences et cela 633 foit (nombre de pays distinct)

    en fait je 72 minutes de traitement pour une lecture de 633 * 58000 lignes

    avec vous une autre idée d'algo

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 754
    Points : 13 340
    Points
    13 340
    Par défaut
    Pour un traitement ultra rapide, il faudrait générer une table de hachage de tes données. Ce qui revient à calculer une représentation sous la forme d'un entier (Code de hachage) de ta chaîne (un champ de ton cvs)

    Il faudra certainement une table par champ de recherche. Les tables sont sous la forme Array of Array of integer. La 1ère array est le hash calculé et la 2ème la table des collisions. (Plusieurs chaînes pourraient avoir la même valeur de hash => Collision)

    A l'utilisation, tu n'auras plus qu'à générer le code de hachage de la chaîne de recherche qui te renverra immédiatemant à l'index de la table qui elle-même contiendra les indexes dans le TStringList qui te donnera une nouvelle valeur de recherche, etc.

    La génération des tables ne devrait prendre que quelques secondes et le tri sera quasi instantané (travail uniquement sur des entiers)

    C'est le principe des aides à la saisie dans les traitements de textes basés sur un fichier texte qui peuvent contenir plus de 100'000 mots

    Tu as même sous Delphi (et oui) une class THashedStringList dans l'unité IniFiles. Je ne lai personnellement jamais testée et ne sait pas si elle est adaptée à tes besoins. Mais elle peut en tous les cas te données une base de départ.

  12. #12
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    ca depend de la nature de ton traitement pour chaque pays, mais pourquoi ne pas faire comme ca :


    si ton algo de base est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CSV := ChargeCSV(); // 58000 elements
    P := recherche des pays distincts(); //633 elements
     
    for i := 0 to P.Count-1 do
    begin
      P[i].nbHab := 0;
      for j := 0 to CSV.count-1 do
      begin
        if CSV[j].pays = P[i].pays then
          P[i].nbHab := P[i].nbHab + CSV[j].NbHab;
      end;
    end;
    alors tu peux le remplcaer comme ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CSV := ChargeCSV(); // 58000 elements
    P := TList.Create;
     
    for i := 0 to CSV.count-1 do
    begin
      idPays := RecherchePays(P, CSV[i].pays);
      if idPays = -1 then
        idPays := AjouterUnPays(P, CSV[i].pays);
     
      P[idPays].nbHab := P[idPays].nbHab + CSV[i].NbHab;
    end;
    mais tout depend du traitement que tu as a faire pour chaque pays.
    Dans mon cas, tu ne fais qu'une fois le parcours des 58000 lignes, mais tu fais 58000 fois la recherche du pays courant dans P (qui contient au max 633 elements dans ton cas). si tu utilise une table de hachage pour P, alors la recherche sera nettement plus rapide. A mon avis, en utilisant ma methode, tu aura un gain de temps enorme. Mais je le repete, ca depend totalement du traitement que tu as a faire pour chaque pays.

  13. #13
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 289
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 289
    Points : 1 940
    Points
    1 940
    Par défaut
    Sur le principe, je déclarerais un record (ou un objet) avec les différents champs du csv.
    Je chargerais le fichier dans le TList (liste de record, ou d'objets), ensuite je surchargerais la méthode Sort (ou compare, je ne sais plus) pour classer de la manière souhaitée.

    Ensuite une fonction pour retrouver le premier élément d'un pays par une recherche dichotomique (légérement modifée pour tomber sur le premier et pas en plein milieu des éléments de ce pays).

  14. #14
    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 de cette contribution, en fait j'ai mis en place l'algo n°2

    je continue à rechercher les raisons de la lenteur

  15. #15
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 871
    Points : 11 361
    Points
    11 361
    Billets dans le blog
    6
    Par défaut
    pourquoi ne pas utiliser une BDD à charger avec le CSV, qq clefs sur les champs pertinents, et des requêtes bien conçues : ça devrait faire le boulot, non ?

  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
    Vous allez rire, j'ai modifié le traitement il là boum moins de 5 minutes, en fait je parcours la liste une seule fois et cela est suffisant

    en tous cas merci à tous, un peu de réflexion et d'aide et tous marche

    Cordialement
    Qays

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 20/06/2005, 12h17
  2. [C#] Calcul du temps d'exécution.
    Par lozzko dans le forum Windows Forms
    Réponses: 4
    Dernier message: 12/06/2005, 16h12
  3. Réponses: 2
    Dernier message: 25/05/2004, 15h33
  4. Affichage du temps d'exécution d'une requête
    Par milka dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 22/03/2004, 17h48
  5. Temps d'exécution des instructions FPU
    Par ubi dans le forum Assembleur
    Réponses: 2
    Dernier message: 24/10/2003, 18h39

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