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 :

Parcourir un fichier texte sans charger le fichier


Sujet :

Delphi

  1. #121
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 488
    Points : 397
    Points
    397
    Par défaut
    Citation Envoyé par Art19
    est ce que ca veut dire que quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if lignes.IndexOf(s) > -1
    il va me renvoyer true dans certains cas alors que s n'appartient pas a lignes?? dans ce cas la c'est une veritable catastrophe parce qu'il va me reperer des doublons qui n'existent pas!
    Non, rassures toi. Le THashedStringList utilise bien le HashOf pour indéxer les chaînes, mais il vérifie ensuite que la (ou les) chaînes ayant ce hash sont identiques à la chaîne recherchée.

  2. #122
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 488
    Points : 397
    Points
    397
    Par défaut
    Citation Envoyé par Gilbert Geyer
    ... par exemple la fonction HashOf(string) renvoie un cardinal (fonction de l'unités IniFiles utilisée dans THashStringList de Delphi) autrement dit cette fonction convertit les strings en des entiers et ensuite les comparaisons ne s'effectuent plus qu'entre ces entiers d'où gain de vitesse lors des comparaisons.
    En fait c'est un peu plus compliqué. La valeur du hash est utilisée pour l'insertion et la recherche dans un arbre binaire équilibré, donc avec des fonctions d'insertion et de recherche ayant une complexité en O(log2(n)). C'est à dire que lorsque l'on double le nombre de valeurs la recherche et l'insertion augmentent de façon linéaire.

    voir par exemple http://fr.wikipedia.org/wiki/Arbre_binaire_de_recherche

  3. #123
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 210
    Points : 84
    Points
    84
    Par défaut
    Non, rassures toi. Le THashedStringList utilise bien le HashOf pour indéxer les chaînes, mais il vérifie ensuite que la (ou les) chaînes ayant ce hash sont identiques à la chaîne recherchée.
    alors quel est l'interet de hasher?

    ah oui c'est bon j'ai compris (il regarde si les chaines sont identiques que quand le hash est identique.. is that it?)

  4. #124
    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 263
    Points
    3 263
    Par défaut
    A Art19 : Mille excuses de t'avoir fait peur à propos de mes constats avec les HashOf.

    A Sovitec : : Merci pour ces infos rassurantes / THashedStringList (ruse de Sioux : mais il vérifie ensuite que la (ou les) chaînes ayant ce hash sont identiques à la chaîne recherchée).

    Vu Wikipédia/Arbre binaire de recherche : Et dire qu'avec toute cette usine-à-gaz située en arrière-plan des THashedStringList cela ait quand-même permis à Art de multiplier par 1000 la rapidité d'exécution de son code ... ben chapeau!

    Au fait c'est quoi la formule du "... hash MD5" histoire de comparer avec la formule du HashOf(string)? (simple curiosité intellectuelle).
    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  5. #125
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 210
    Points : 84
    Points
    84
    Par défaut
    bon merci a vous..
    Gilbert, j'ai dit 1000 mais c'est un peu une expression parce que je n'ai pas mesure. Mais c'est vraiment beaucoup beaucoup plus rapide.. c'est sur que la Hashed est optimisee pour ce genre de requetes.. il faut juste le savoir.. apres c'est interessant de savoir ce qu'il se passe derriere

  6. #126
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    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 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Si tu remets une TStringList mais que tu ajoute Sorted := True, est-ce vraiement différent de la THashedStringList ?
    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

  7. #127
    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 263
    Points
    3 263
    Par défaut
    A Art19 : "il faut juste le savoir.. apres c'est interessant de savoir ce qu'il se passe derriere" : Exact, mais il y a tellement de trucs à savoir! On n'arrête pas de découvrir et je n'en suis qu'à Delphi-5 ...
    Je vais faire quand-même faire des tests pour voir s'il n'y a pas moyen de faire un peu plus speed avec une lecture via TFileStream ... et avec chrono à l'appui.
    Cela m'occupera demain.
    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  8. #128
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 488
    Points : 397
    Points
    397
    Par défaut
    Citation Envoyé par Art19
    alors quel est l'interet de hasher?

    ah oui c'est bon j'ai compris (il regarde si les chaines sont identiques que quand le hash est identique.. is that it?)
    Oui, exactement.

    Citation Envoyé par Gilbert Geyer
    Au fait c'est quoi la formule du "... hash MD5" histoire de comparer avec la formule du HashOf(string)? (simple curiosité intellectuelle).
    Tu peux trouver le principe .

    La principale différence avec le HashOf de Delphi est que le hash est sur 128 bits et que deux chaînes très proches engendrent des hash très différents. Du fait que le hash est sur 128 bits le paradoxe des anniversaires montre que la probabilité que deux chaînes différentes aient un hash identique est négligeable quand le nombre de chaînes est d'un ordre inférieur à 2^60 (un milliard de milliards). Concrètement la première collision sur des hash MD5 date de moins de trois ans, et résulte d'une construction mathématique très complexe, on n'a jamais réussi à générer une collision "par hasard". De ce fait on peut se contenter de comparer uniquement les hash dans l'application qui nous intéresse, pas besoin de conserver la chaîne elle même.


    Citation Envoyé par ShaiLeTroll
    Si tu remets une TStringList mais que tu ajoute Sorted := True, est-ce vraiement différent de la THashedStringList ?
    L'insertion dans un TStringList se fait en O(n) losque Sorted = True (Il faut décaler toutes les chaînes suivant celle que l'on veut insérer). Donc la recherche est rapide, mais l'insertion lente, ce qui est l'opposé du cas Sorted = False où l'insertion est rapide mais la recherche lente.

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 210
    Points : 84
    Points
    84
    Par défaut
    est-il raisonable de supprimer les doublons en :

    * trier le fichier en appliquant un tri a bulles
    * comparer chaque ligne a la ligne precedente

    ?

  10. #130
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 559
    Points : 3 948
    Points
    3 948
    Par défaut
    Le tri à bulle n'est pas forcément adapté à un fichier de grande taille. Autre écueil : si les enregistrements du fichier sont de taille variable, cela va compliquer l'algorithme.

    cdlt

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  11. #131
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 210
    Points : 84
    Points
    84
    Par défaut
    le meilleur algo doit etre le quicksort j'imagine. quelqu'un peut me l'expliquer rapidement sur un petit exemple svp?

  12. #132
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 559
    Points : 3 948
    Points
    3 948
    Par défaut
    Citation Envoyé par Art19
    le meilleur algo doit etre le quicksort j'imagine. quelqu'un peut me l'expliquer rapidement sur un petit exemple svp?
    Pour tout dire, je suis en train de travailler sur le sujet (recherche de doublons en maintenant un fichier d'index triés grâce au QuickSort),
    ça avance mais je n'ai pas beaucoup de temps devant moi. La solution sur laquelle je travaille devrait m'affranchir des limites de taille sur les fichiers à 2 Go mais je n'ai pas d'idée précise sur la performance de la solution.

    cdlt

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  13. #133
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 488
    Points : 397
    Points
    397
    Par défaut
    Puisque tu as déjà une méthode pour supprimer les doublons pourquoi vouloir faire un tri maintenant ? La problématique à changé ?

    Sinon si le quicksort est bien en O(nLog(n)) en moyenne (donc optimal) il est par contre en O(n²) dans le pire des cas (donc pas meilleur qu'un algorithme naïf). Et le pire des cas se produit facilement, il suffit que l'ensemble soit déjà trié.

  14. #134
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 210
    Points : 84
    Points
    84
    Par défaut
    vu que j'ai 19 000 fichiers qui ne sont pas tries le pire des cas ne risque pas d'arriver...

    Puisque tu as déjà une méthode pour supprimer les doublons pourquoi vouloir faire un tri maintenant ? La problématique à changé ?
    je n'ai jamais dit que j'avais une methode pour supprimer les doublons.. je sais juste reperer si il y a AU MOINS un doublon dans un fichier c'est tout

  15. #135
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 559
    Points : 3 948
    Points
    3 948
    Par défaut
    Ma solution (non encore testée ni publiée) risque de peiner sur 19 000 fichiers mais elle devrait être adaptée à un gros fichiers.
    Est-ce que tes fichiers peuvent être fusionnés, en d'autres termes est-ce leur contenu est compatible?

    Je rappelle ce que je disais tout à l'heure, un tri Shell est pratique à mettre en oeuvre dans une structure indexée, ce qui n'est pas forcément le cas avec un fichier texte. En outre un tri directe sur les chaînes de caractères risque de plomber les perf.

    cdlt

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  16. #136
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 210
    Points : 84
    Points
    84
    Par défaut
    mes fichiers ne doivent surtout pas etre fusionnes looool

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 210
    Points : 84
    Points
    84
    Par défaut
    personnellement ma preference va vers le tri a bulles car il est nettement plus facile a implemanter que le quick sort.. mais en meme temps le quick sort s'avere etre beaucoup plus rapide dans le meilleur des cas

  18. #138
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 488
    Points : 397
    Points
    397
    Par défaut
    Citation Envoyé par Art19
    je n'ai jamais dit que j'avais une methode pour supprimer les doublons.. je sais juste reperer si il y a AU MOINS un doublon dans un fichier c'est tout
    Oui, mais il est facile d'étendre la méthode de recherche de doublon. Il suffit de ne pas insérer les chaînes qui sont des doublons, puis de réécrire le THashedStringList dans un fichier si des doublons ont été détectés.

  19. #139
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 210
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par sovitec
    Oui, mais il est facile d'étendre la méthode de recherche de doublon. Il suffit de ne pas insérer les chaînes qui sont des doublons, puis de réécrire le THashedStringList dans un fichier si des doublons ont été détectés.
    c'est vraiment pas bete du tout ca! comment n'y avais-je pas pense.. le seul truc c'est que dans mon algo actuel, je fais un break des que je repere le 1er doublon.
    autre inconvenient: je ne sais pas si je pourrais loader tout un fichier dans une THashedStringList..

    reste a savoir aussi la performance d'un SaveToFile..

    qu'en pensez vous?

  20. #140
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 559
    Points : 3 948
    Points
    3 948
    Par défaut
    Citation Envoyé par Art19
    personnellement ma preference va vers le tri a bulles car il est nettement plus facile a implemanter que le quick sort.. mais en meme temps le quick sort s'avere etre beaucoup plus rapide dans le meilleur des cas
    Si tu veux un exemple de mise en oeuvre du tri quicksort, étudie le code de la méthode TList.Sort (dans l'unité Classes de la VCL). Il n'y a pas d'explication mais le code est facile à adapter.

    cdlt

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

Discussions similaires

  1. [XL-2010] Copier le contenu d'un fichier texte dans un autre fichier texte
    Par Piixx_e dans le forum Macros et VBA Excel
    Réponses: 29
    Dernier message: 15/11/2013, 11h31
  2. copier plusieurs fichiers texte dans un seul fichier texte
    Par ERICKO dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 17/08/2008, 20h21
  3. Imprimer un fichier texte sans l'afficher
    Par sheira dans le forum ASP
    Réponses: 7
    Dernier message: 13/12/2005, 12h10
  4. charger un fichier texte du disque dur
    Par frol dans le forum Langage
    Réponses: 2
    Dernier message: 02/11/2005, 17h09
  5. Fichiers texte sans accents
    Par mika dans le forum Langage
    Réponses: 5
    Dernier message: 03/11/2004, 16h42

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