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

avec Java Discussion :

Optimiser le temps de parcours d'un vecteur


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 8
    Par défaut Optimiser le temps de parcours d'un vecteur
    Bonjour à tous,

    J'ai effectué une requete dans ma base de données qui me renvoie un vecteur contenant 300.000 objets. Ces objets sont des instances de la classe Element, que j'ai créé.

    Bref, le problème, c'est que ça met un temps fou à parcourir mon vecteur. En gros je veux récupérer chaque objet, pour récupérer son id, et le stocker dans un string que je vais concaténer, pour ensuite m'en servir dans une requete DELETE.

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    // je récupère dans un vecteur les objets que j'ai sélectionnés dans une liste à l'écran
    Vector selection = getElementListPanel().getObjetsSeleted();
    // je trim le vecteur histoire d'ajuster sa taille au contenu réel
            selection.trimToSize();
    // je change le curseur en sablier
            setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
    // je récupère la taille actuel du vecteur ( 300.000 environ )
            int taille = selection.size();
    // tant qu'on a pas atteint la taille, on boucle
            for ( i = 0; i < taille; i++) {
    // on concatène un string, qui sera la clause IN ( xx, xx, xx ... )  d'une futur requete
                clauseIn += "'"+((Element) selection.get(i)).getCode()+"',";
            }
    Actuellement, je parcourt 30.000 ligne en 2minutes ... des idées pour optimiser le tout ?
    J'ai essayer avec un enume de mon vecteur, mais c'est tout aussi long

    merci d'avance,

    a+

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    La concaténation de String avec + (ou +=) doit se limiter à des opérations simple sur une seule ligne. Il faut éviter à tout prix d'utiliser cela dans une boucle car cela crée à chaque fois 2 objets temporaires...

    Le tout multiplié par 300 000 ca fait mal !


    Utilise StringBuilder pour créer la chaine (ou StringBuffer avec du Java < 5.0).


    a++

    PS : Une clause IN de 300 000 éléments !!! C'est pas un peu beaucoup

  3. #3
    Membre émérite Avatar de JoeChip
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 536
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     for ( i = 0; i < taille; i++) {
                clauseIn += "'"+((Element) selection.get(i)).getCode()+"',";
    Inutile d'utiliser i, il faut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (Element e : selection)
    et utiliser un StringBuilder, en effet... Puis une clause IN avec 30.000 éléments, ça semble faux quelque part... doit y avoir un solide problème de conception, voire de conceptions...

  4. #4
    Membre habitué
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 8
    Par défaut
    Merci pour vos réponse, je vais essayer le stringBuilder

    Pour la clause In de 300k conditions, c'est simple :
    Le but de la manoeuvre, c'est nettoyer ma table élément de tous les éléments n'ayant aucune correspondance avec une autre table dans la base ( qui fait tout de meme 4Go ), donc :

    1 ) je fais une requete dans ma base, récupérant tous les éléments n'ayant aucun lien avec les autres tables ( select elID from element where not exist blabla )
    2 ) le résultat de la requete est stocké dans un vecteur, puis affiché à l'écran dans une liste ( ça prend 20sec jusque là, meme pas )
    3 ) l'utilisateur coche les éléments qu'il veut supprimer parmi ceux affichés ( je les coche tous, = 300.000 )
    4 ) j'appuie sur supprimer, et c'est la que mon bout de code démarre
    5 ) une fois la clause In construite, je lance la requete DELETE, qui prend quasi pas de temps à s'éxécuter


    Fin bref, la longueur de la clause In semble pas poser de soucis pour la requete DELETE, et je pense que c'est ma seule solution non ?
    Car les éléments affichés dans la liste sont des objet Elements, contenant un libellé, et un Id. Il faut que je récupère l'id de chaque élément sélectionné, c'est forcé

  5. #5
    Membre habitué
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 8
    Par défaut
    Un grand merci.

    Compte rendu : ma requete qui prenait 30min n'en prend plus que 3... secondes

    Fin, je dis ma requete, mais c'est en fait le parcourt du vecteur qui prenait tout ce temps^^'

    voila voila, a+

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

Discussions similaires

  1. Optimisation du temps de traitement
    Par djuddju dans le forum Oracle
    Réponses: 4
    Dernier message: 20/04/2006, 21h16
  2. optimiser le temps d'exécution de l'explorateur windows
    Par ben_iap dans le forum Autres Logiciels
    Réponses: 6
    Dernier message: 31/01/2006, 22h04
  3. Réponses: 9
    Dernier message: 20/06/2005, 12h17
  4. [SGBD]Optimiser le temps d'accès aux données (schéma BD)
    Par vsavoir dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 08/10/2004, 18h33
  5. optimisation de temps de traitement xml/xslt
    Par Erwy dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 06/05/2004, 16h08

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