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++Builder Discussion :

Recherche rapide


Sujet :

C++Builder

  1. #1
    Membre du Club

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 28
    Points : 55
    Points
    55
    Par défaut Recherche rapide
    Bonjour,

    je rencontre actuellement le problème suivant :

    je doit trouver dans une base de données (format non encore défini, alors si vous avez une idée... ) un enregistrement dans une table en contenant environ 16000.

    La recherche s'effectue sur un seul champs alphanumérique de 9 caractères.

    Important : le délai maximal imparti pour obtenir la réponse est de 40 millisecondes environs.

    Avez-vous une idée sur la façon d'obtenir de telles performances ?
    (format de base particulièrement rapide - pour info la base est en local avec un seul utilisateur connecté -, chargement préalable de la base en mémoire, ... )

    D'avance merci pour votre aide.

  2. #2
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Points : 1 271
    Points
    1 271
    Par défaut
    En quoi est-ce du C++ Builder ?

  3. #3
    Rédacteur
    Avatar de Giovanny Temgoua
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    Points : 4 006
    Points
    4 006
    Par défaut
    Salut,

    je doit trouver dans une base de données (format non encore défini, alors si vous avez une idée... )
    Donc tu veux savoir comment obtenir des performances maximales sur une base qui n'existe pas encore ?

    Comme la base est en local, ce sera facile d'avoir de bonnes performances mais entre nous je n'ai jamais chronométré (donc j'ignores si c'est moins de 40 milliseconds). Par ailleurs, à mon avis, Paradox pourrait résoudre ton problème et pourquoi pas Access...

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2002
    Messages : 28
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par King Kaiser
    Par ailleurs, à mon avis, Paradox pourrait résoudre ton problème et pourquoi pas Access...
    Euuhh ... paradox peut être .. et même surement ... mais access .. avec 16000 Lignes ... avoir un délai de réponse de moins de 40 millisecondes ... je ne crois pas que ce sera possible ...

    Sinon .. mySQL devrait également te convenir ... pour ce qui est des temps de réponses rapides ..

    Cordialement

    Bertrand

  5. #5
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Points : 1 271
    Points
    1 271
    Par défaut
    De toutes façons, quelle que soit la base, il faudra bien la structurer (au niveau types de champs, index, ...).

    De plus, 40ms, ça me parait quand même court. Sachant que le modèle de gestion des processus de Windows implique qu'un thread peut garder le processeur jusqu'à 20ms, j'espère que cette recherche n'est pas critique pour ton application...

    Arnaud

  6. #6
    Membre du Club

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 28
    Points : 55
    Points
    55
    Par défaut
    Merci pour vos réponse...

    j'espère que cette recherche n'est pas critique pour ton application...
    malheureusement elle l'est...

    Je me suis probablement mal expliqué, j'ai essayé les formats de base les
    plus courants (MySQL, Access, Paradox, ...) : aucune ne répond dans les temps.

    Existe-t-il un composant style TListView 'amélioré' qui me permettrait de charger les enregistrements avant de commencer ?

    Sinon je serais obligé de tout charger en mémoire et d'appliquer un algorithme de recherche (je me tournerai alors vers le forum 'Algorithmes', désolé GreyBird si je me suis trompé de forum... ).

    Précision : le but de la recherche est de savoir si l'enregistrement existe ou pas, il suffirait donc de pouvoir charger dans un liste uniquement le champs ciblé et non pas tous les champs de tous les enregisrements...

  7. #7
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Le champ cible (index) est de quel type ? Peut-être en faisant une sorte de table de hashage non ?
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  8. #8
    Membre du Club

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 28
    Points : 55
    Points
    55
    Par défaut
    Dans la base, le champs cible est de type alphanumérique sur 9 caractères.
    Néanmoins dans la pratique, les caractères seront des chiffres, il est donc envisageable de les transformer en type numériques à l'exécution.

    Effectivement j'envisage de charger la liste en mémoire sous forme d'arbre
    avec des sortes de 'labels' permettant de ne parcourir que la portion de l'arbre susceptible de contenir l'index qui m'intéresse.

  9. #9
    Rédacteur
    Avatar de dvsoft
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2002
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2002
    Messages : 176
    Points : 622
    Points
    622
    Par défaut
    bonjour,

    Et bien c'est une question très intéressante. Au départ, je suis de l’avis de grebird, mais j’ai quand même voulu faire un test, et ma fois les résultats sont surprenants.

    Taille de la table : 139441 enregistrements

    Fonction de recherche

    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
    28
    29
     
    void __fastcall TForm1::BtnFindClick(TObject *Sender)
    {
        TLocateOptions Ops;
        TDateTime      Begin,End;
        bool           bResult;
     
        //--- Options de recherche
        switch (FFldRef->DataType) {
            case ftString:
                Ops = TLocateOptions() << loCaseInsensitive << loPartialKey;
                break;
            default:
                Ops = TLocateOptions();
        }// End Switch
       //--- Prendre le temps de Debut
        Begin = Time();
        //--- Recherche par locate
        bResult = ABSTable1->Locate(FFldRef->FieldName,FldFind->Text,Ops);
        //--- Prendre le temps de fin de recherche
        End = Time();
        //--- Afficher le resultat
        if (bResult)
            MessageDlg("Enregistrement trouvé", mtWarning, TMsgDlgButtons() << mbOK, 0);
        else
            MessageDlg("Enregistrement non trouvé", mtWarning, TMsgDlgButtons() << mbOK, 0);
        //--- Affichage du temp
        FldTime->Caption = IntToStr(MilliSecondOf(End-Begin));
    }
    Resultats:

    Sur un champ de type Integer avec index temps maxi < 5ms
    Sur un champ de type string[5] sans index temps maxi < 16ms
    Sur un champ de type string[40] sans index temps maxi < 40ms
    Je tiens a votre disposition le programme de test ainsi que la base de donnée pour faire des tests chez vous, je serais curieux de connaître les resultats .

    J'oublier:
    PC entium 4 à 3.8Go
    RAM DRII 533Mhz 1go
    DISQUE:S-ATA 80go Maxtor 6Y080MO
    SGBD : AbsoluteDB


    A bientot

    Alain

  10. #10
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Points : 1 271
    Points
    1 271
    Par défaut
    A noter que les 20ms que je cite sont un maximum, mais que comme tout maximum, il peut arriver qu'il soit atteint
    Ta config est néanmoins réellement puissante en comparaison de ce qu'on peut parfois trouver en milieu professionnel

    Il faudrait également connaître la cible...

  11. #11
    Rédacteur
    Avatar de dvsoft
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2002
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2002
    Messages : 176
    Points : 622
    Points
    622
    Par défaut
    bonsoir,

    Je viens de faire le même test sur une machine moins puissante

    PC entium 4 à 2Go
    RAM :RAMBUS 1mo
    DISQUE:ATA 80go 8Mb de cache
    SGBD : AbsoluteDB

    Les temps sont les même, de plus je pense que les methode d'acces a la base de temps de XP ne sont pas fiables, mais bon il faut une reference.
    AbsoluteDB, permet de configurer le nombre et la taille des pages en memoire:
    Page Size = 4096
    Page count in Extent = 64

    Taille de Base de donnée 264 457Ko

    Je n'utilise pas pour le test, l'option de charger completement la base en memoire, je travail sur le disque.
    Voila, je pense qu'il faut faire d'autre tests, AbsoluteDB est vraiment tres rapide, mais elle n'offre pas toutes les possibilitées des SGBD comme MySQL, ou firebird.

    A bientot
    Alain

  12. #12
    Membre du Club

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 28
    Points : 55
    Points
    55
    Par défaut
    Je n'ai effectivement pas testé AbsoluteDB auparavant, il semble rapide en effet. N'ayant pas besoin des fonctionnalités avancées des SGBD cela semble être la solution à mon problème, je vais essayer et je vous tiens au courant.

    Un grand merci à tous!!

    PS : savez vous s'il existe une version d'évaluation ?

  13. #13
    Rédacteur
    Avatar de dvsoft
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2002
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2002
    Messages : 176
    Points : 622
    Points
    622
    Par défaut
    bonjour

    La version perso est gratuite et fonctionne tres bien, c'est elle que j'ai utilisée pour faire le test

    http://www.componentace.com/download/unlock.php?c=&editionid=1&fileid=63

    Bon courage

    Alain

  14. #14
    Membre du Club

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 28
    Points : 55
    Points
    55
    Par défaut

  15. #15
    Rédacteur
    Avatar de dvsoft
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2002
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2002
    Messages : 176
    Points : 622
    Points
    622
    Par défaut
    bonjour

    J'ai oublier. Je ne sais pas si tu utilise DBDesigner4 pour modeliser tes bases de données, mais si c'est le cas et si cela peut te donner un coup de mains, j'ai fait un AddOn qui produit le code SQL pour la creation des tables AbsoluteDB et les XML pour la creation des dico de données.

    J'ai egalement un QBE pour AbsoluteDB, qui produit le SQL pour l'interrogation.

    Demande moi,

    Alain

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

Discussions similaires

  1. Suggestion pour ameliorer le forum: la Recherche Rapide !
    Par 5:35pm dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 2
    Dernier message: 08/07/2006, 09h19
  2. Structure de données pour recherche rapide
    Par socrate dans le forum C
    Réponses: 1
    Dernier message: 18/06/2006, 14h49
  3. Réponses: 7
    Dernier message: 15/02/2006, 11h52
  4. Recherche rapide dans un TDBGrid
    Par Dinytro dans le forum C++Builder
    Réponses: 5
    Dernier message: 10/03/2005, 00h29
  5. [Kylix] Combobox recherche rapide
    Par litbos dans le forum EDI
    Réponses: 3
    Dernier message: 29/08/2003, 10h13

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