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

Collection et Stream Java Discussion :

[Conception][performance] mysql table de 10000 enregistrements / hashmap


Sujet :

Collection et Stream Java

  1. #1
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut [Conception][performance] mysql table de 10000 enregistrements / hashmap
    Bonjour,

    J'ai posté ce message dans le forum MySQL mais je n'ai pas de réponse pour le moment et peut etre que le forum java est plus approprié pour ma question.

    J'ai une base de données MySQL. J'ai une table contenant 10 000 enregistrements (pour l'instant, un seul champ par enregistrement). Le but du programme java est de rechercher, pour chaque enregistrement, s'il se trouve dans un texte d'environ 25 lignes.

    Ce que j'ai fait:
    Je parcours ligne par ligne la table (select * from ma_table) et je recherche pour chaque enregistrement s'il est présent dans le texte. Mais c'est très long (plusieurs minutes).

    Est-ce plus performant de stocker les 10 000 lignes dans une hashmap ? puis de faire une itération sur la hashmap et de rechercher dans le texte à partir de la hashmap ? ou bien est ce que c'est long aussi de mettre les données de la table dans une hashmap?

    Merci de vos conseils

  2. #2
    Expert éminent

    Avatar de christopheJ
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 600
    Points : 8 235
    Points
    8 235
    Par défaut
    Bonjour,

    Je ne sais pas si cela peut répondre.....
    Pourquoi ne pas inserer ton texte dans une table avec un mot par ligne et ensuite laisser la base faire une jointure sur les deux tables....
    Le Resultset te donnera la liste des mots présents dans ton texte et dans la base.
    Je pense que ce sera plus performant que de balayer tout ton texte en comparant les mots un par un avec un mot extrait de la base....

  3. #3
    NGY
    NGY est déconnecté
    Membre habitué
    Inscrit en
    Août 2002
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 137
    Points : 164
    Points
    164
    Par défaut
    Si ta table ne contient qu'un seul champ, ce ne devrait pas être trop lourd de tout stocker dans une structure.
    Le gain en termes de performance devrait être conséquent et 10000 String, c'es pas si énorme que ça. (à moins qu'elles ne fassent chacune des dizaines Ko)
    Par contre, je stockerais plutôt les données dans un Set et pour savoir si le texte est présent, tu fais un mesDonnes.contains().

  4. #4
    Expert éminent sénior


    Profil pro
    Inscrit en
    Mai 2003
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 3 240
    Points : 11 101
    Points
    11 101
    Par défaut
    J'ai quelques questions:
    Est-ce que le programme va servir qu'une seule fois ?
    Est ce que la table est souvent mise à jour ?
    Est-ce que le texte est toujours de maximum 25 lignes (de 80 caractères ??) et les enregistrements contiennent 1 seul mot (ou une phrase) ?

    Si ce n'est qu'une seule fois, on s'en fout un peu si on devra attendre 5 minutes au lieu de 30 secondes, comparé au temps que tu passeras à l'optimiser.

    Si la table n'est (presque) jamais mise à jour, le la chargerais une fois dans la structure, et ensuite je serialiserais la structure pour la recharger à la prochaine occasion. A la limite, même intérroger la table pour voir si elle a été modifiée depuis la dernière sérialisation.

    Si le texte est toujours de maximum 25lignes * 80 caractères, tu as plus intérêt à inverser ton processus, non ?

    Pour chaque mot (ou phrase) du texte, le mettre dans une Collection n'acceptant pas les doublons (pour éviter de stoquer 2 fois le même mot (ou la même phrase)).

    Ensuite, pour chaque entrée de cette Collection, vérifier s'il elle est présente dans la table.

    En supposant qu'un texte de 25 lignes*80 caractères contient environ 400 mots (ou 100 phrases). Cela te fera 400 (100) selects maximum sur la db retournant un record (entrée présente dans la table ou pas)au lieu de faire 1 select retournant 10000 records. Et si tu utilises un PreparedStatement pour cela, tu amélioreras également les performances.

    Aussi, si tu veux rien changer à ton code existant, essayes toujours d'augmenter le nombre de records qui doivent être retournés à la fois.
    http://javasearch.developpez.com/j2s...FetchSize(int)
    Pour le mettre à 100 par exemple si tes enregistrements ne sont pas trop grand.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 8
    Points : 9
    Points
    9
    Par défaut
    Comme ChristopheJ, je pense que le plus efficace, c'est de stocker tous tes mots du texte dans une temporary table et d'effectuer ensuite une jointure.

    Ca te donnerai un code sql de ce genre (pour selectionner les mots de ton txt qui ne sont pas ds la table, si je me suis pas trompé ds ma jointure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CREATE TEMPORARY TABLE temp ( mot text NOT NULL);
    INSERT INTO temp ('mot1'), ('mot2') .. ('motN');
    SELECT * FROM temp LEFT JOIN my_table ON temp.mot = my_table.mot WHERE my_table.mot IS NULL;

  6. #6
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    Tout d'abord merci à tous les 4 pour vos réponses.
    Pr répondre aux questions de vbrabant,
    - le programme va servir plusieurs fois
    - les tables seront peu souvent mises à jour
    - les textes feront casi toujours entre 20 et 30 lignes
    - les enregistrements contiennent des expressions de 1 à 8 mots environ

    J'avais imaginé un truc du genre de NGY mais je pensais utilisé une map et non un set. C'est vrai qu'avec les sets , je n'aurai pas de doublons. Mais normalement, dans mes tables, il n'y en a pas de doublons. Donc je vais chercher les différences de performance entre map et set.

    En ce qui concerne la méthode de christopheJ et mouquiette, et le conseil de vbrabant pour inverser le processus (mettre les mots ou phrases dans une collection puis pour chq entrée de la collection, regarder si elle est présente dans la table des 10000 enregistrements) :

    si dans mon texte, j'ai la phrase: "il fait tres beau" et dans ma table T, j'ai l'enregistrement "tres beau" :

    - si je mets les mots du texte un par un dans la collection ou un par un ds la table temporaire, il y aura les mots :"il", "fait","tres", "beau". Dans la table T , j'ai 1 enregistrement contenant "tres beau" mais pas "tres" tout seul ni "beau" tout seul. Est ce que ça trouvera qd meme que les mots du texte "tres" et "beau" sont dans la table T?

    - si je mets les phrases du texte une par une dans la collection ou ds la table temporaire, j'aurai : "il fait tres beau". Dans la table T , j'ai toujours l'enregistrement contenant "tres beau". est ce que ça trouvera qu'il y a une partie des mots de la phrase qui sont présents dans la table T ? car c'est 100% sur que je n'aurai jamais une phrase complète du texte présente dans la table T , mais seulement des expressions de quelques mots.

    voila pr mes questions.
    Merci de votre aide.

Discussions similaires

  1. [MySQL-5.1] performances et table d'environ 38000 enregistrements
    Par ben53 dans le forum Débuter
    Réponses: 2
    Dernier message: 22/08/2013, 14h52
  2. Réponses: 2
    Dernier message: 11/08/2008, 16h33
  3. Réponses: 3
    Dernier message: 21/10/2005, 15h56
  4. [performance] table de 10000 enregistrements
    Par debdev dans le forum Requêtes
    Réponses: 10
    Dernier message: 12/07/2005, 15h20
  5. Tables jointes, avec enregistrements multiples
    Par ARRG dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/07/2004, 15h00

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