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

Delphi Discussion :

Performance des TstringList


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Inscrit en
    Février 2003
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 7
    Par défaut Performance des TstringList
    Bonjour,

    J'utilise une TStringList, que je remplie à partir d'un fichier (plus de 4M).
    Il y a environ 40000 lignes dans ce fichier qui donne au résultat 40000 éléments dans la TStringList, auxquels j'associe un objet.
    Chaque ligne du fichier est définie par un identifiant qui est stocké dans la partie string de la liste. Le reste de la ligne renseigne les attributs d'un objet qui est stocké dans la partie object de la liste. (j'espère que tout le monde me suit jusqu'ici ).
    Bon tout cela fonctionne comme je le souhaite, mais c'est comment dire.. extremement lent ! (presque 30 minutes pour lire fichier)
    Parce qu'à chaque fois que j'ajoute un élément dans la liste, je vérifie qu'il n'existe pas déjà dans la liste via la commande indexof... et forcément plus il y a d'éléments dans la liste plus cela prends du temps.

    J'ai déjà remplacé la TstringList par une THashedStringList, mais les performances ne sont guère mieux.

    En gros je cherche un autre moyen de gérer tout ça, un autre objet... enfin quelque chose qui améliorerait les temps de traitements.

    Donc si vous avez des suggestions, merci de les proposer.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2003
    Messages : 115
    Par défaut
    Salut

    Je te propose le TClientDataset, au moins pour faire la recherche, et plus si affinités ... :
    tu crée au moins un champ avec ta clé, que tu indexes. Tu rajoute au fur et à mesure dans le clientdataset et tu recherches dedans ...

    Sinon, si tu dois sauver le fichier texte après, une BDD style Firebird ou Firebird embedded serait pas mal ...

    JP

  3. #3
    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
    Par défaut
    Bonjour,

    Autre suggestion : Dans un cas similaire (pb de suppression de doublons pour une série de 19000 fichiers-texte) j'ai pu obtenir une augmentation de vitesse avec un facteur d'accélération de 71 avec la parade suivante qui a permis d'éviter les inconvénients du If IndexOf()-Ralentisseur : on charge tout en vitesse rapide et ensuite on élimine les doublons :
    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
     // lignes désigne ici la StringList créée au préalable
                    ....
                    lignes.Clear;
                    lignes.Sorted := FALSE;  // insertion immédiate par ajouts en fin de liste plus rapide s'il n'y a pas de recherche simultanée
                    lignes.LoadFromFile( NomLongFichierOrig );
                   
                    lignes.Sort; // tri-Alpha
                    lignes.Sorted := TRUE;
    
                    //Boucle de supression Doublons
                    i := lignes.count - 1;
                    repeat j:=i-1;
                           if lignes[i]=lignes[j] 
                           then lignes.delete(i); //< à compléter pour Deleter 
                           //au préalable l'object associé à la string
                           dec(i);
                    until i=0;
                   ........
    ... comme le facteur d'accélération de 71 a été obtenu avec des lignes de Strings sans Objects ... dans le cas présent le facteur d'accélération sera inférieur à 71 mais cela vaut le coup de faire l'essai.
    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  4. #4
    Membre du Club
    Inscrit en
    Février 2003
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 7
    Par défaut
    Merci pour vos réponses rapides.

    Le soucis c'est qu'il n'y a pas que la lecture du fichier qui est longue, il y a la manipulation des données (mise à jours à partir d'une base) qui est aussi considérable.

    Je vais étudier la piste du TClienDataSet. Ne connaissant pas vraiment cet objet, JP aurais tu un lien vers quelques exemples ?

    Encore merci.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2003
    Messages : 115
    Par défaut
    j'ai pas de lien en tête, mais en gros un TClientDataset, c'est une table mémoire (dérivé de TDataset), automome, qui supporte les index, qui peut s'enregistrer (et se charger) dans un fichier XML.

    En gros: tu pose ton TClientDataset, tu double clique dessus et tu rajoutes tes champs (nom et type).
    Pour créer une nouvelle table, tu appelle CreateDataSet sinon tu peux charger avec loadFromFile.

    Après ça se manipule comme un TDataset.
    Pour les recherches, le plus performant, d'après mes tests, c'est d'utiliser
    "EditKey" et "GotoKey"

  6. #6
    Membre du Club
    Inscrit en
    Février 2003
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 7
    Par défaut
    Je viens de mettre en place le TClientDataset, mais je n'avais pas encore vu que tu utilisais les commandes editkey et gotokey.
    Pour l'instant j'ai utilisé la commande filter, et les temps de traitements ne sont pas franchement mieux.
    Par contre je n'ai pas non plus mis en place d'index. Je suppose que ça améliorera également les temps d'execution.
    Bon, je continue..

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Par défaut
    Bonjour,

    Avez vous essayer la propriété propriétéDuplicates ?

    A prioris ce genre de problématique peut être optimisé par cette solution.

    Aide Delphi 7 en français

    Affectez une valeur àla propriétéDuplicates pour spécifier comment la liste réagit àl'ajout d'une chaîne dupliquée dans une liste triée.La propriétéCaseSensitive détermine si deux chaînes sont considérées comme dupliquées lorsqu'elles ne diffèrent que par la casse.

    Duplicates doit avoir une des valeurs suivantes.

    Valeur Signification

    dupIgnore Ignore les tentatives d'ajout de chaînes en double àla liste.
    dupError Déclenche une exception EStringListError lors d'une tentative d'ajout de chaînes dupliquées àla liste triée.
    dupAccept Autorise les chaînes dupliquées dans la liste triée.

    Définissez Duplicates avant d'ajouter des chaînes àla liste.L'initialisation de Duplicates àdupIgnore ou àdupError n'a aucun effet sur les chaînes en double se trouvant déjàdans la liste.

    Remarque : Duplicates n'a aucun effet si la liste n'est pas triée.

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

Discussions similaires

  1. Performances des langages
    Par Lunixinclar dans le forum Langages de programmation
    Réponses: 35
    Dernier message: 29/09/2006, 11h54
  2. Performance des Datasets
    Par Nafanga dans le forum Bases de données
    Réponses: 6
    Dernier message: 10/10/2005, 00h49
  3. performances des virtual functions
    Par xxiemeciel dans le forum C++
    Réponses: 2
    Dernier message: 25/07/2005, 17h24
  4. TobjectList contenant des TstringList
    Par SchpatziBreizh dans le forum Langage
    Réponses: 10
    Dernier message: 08/07/2005, 16h17
  5. Performance des vertex array
    Par Mathieu.J dans le forum OpenGL
    Réponses: 13
    Dernier message: 25/06/2004, 10h47

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