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

Java Discussion :

Stratégie pour afficher un grand nombre de données


Sujet :

Java

  1. #41
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Points : 532
    Points
    532
    Par défaut
    Ah ok

    Le RowSorter n'y est plus, j'insère les données séquentiellement dans la DB ça me renvoie un résultat trié.

    Concernant l'affichage avec la scroll. le getValueAt check s'il peut lire dans le tableau ou dans le resutset. A partir du moment où il lit dans le tableau, tout est niquel et rapide, quand c'est le resultset c'est toujours un peu plus long

    Teste le temps mis pour faire le absolute+getString... --> environ 16ms

    Jusqu'à 50 000 c'est correct, mais après, quand je descend d'un coup sec, la scroll se bloque et suis atteint le curseur de la souris 1 seconde après

  2. #42
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par oneagaindoguys Voir le message
    Jusqu'à 50 000 c'est correct, mais après, quand je descend d'un coup sec, la scroll se bloque et suis atteint le curseur de la souris 1 seconde après
    tu ne garderai pas trop de données en mémoire par hasard, avec des tableaux que tu agrandirai à chaque fois? on peux voir le code actuel?

  3. #43
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Points : 532
    Points
    532
    Par défaut
    Trop ? Je ne crois pas. C'est sûr, ça bouffe de la RAM, mais les temps d'accès sont plus satisfaisant dans un tableau que dans un ResultSet !

    Voici un peu de code :
    - Le constructeur du modèle

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    public TableModel2 (String querry, String[] titres, int minimum, boolean webAccess, DataBase dataBase) {
            this.minimum = minimum;
            this.querry = querry;
            this.titles = titres;
            this.webAccess = webAccess;
            this.dataBase = dataBase;
            long time = System.currentTimeMillis();
            System.out.println("Envoie de la reqûete");
            try {
                this.data = this.dataBase.getResult(querry);
                data.last();
                //data = new Object[data.getRow()][titres.length];
                System.out.println("Resultset est OK  -->  "+(System.currentTimeMillis()-time)+" ms");
                maxDataCount = real = data.getRow();
                System.out.println("taille de la table : "+real);
            } catch (SQLException ex) {ex.printStackTrace();}
            this.dataCopy = new Object[maxDataCount][titres.length];
            this.isNotSelectedRow = new boolean[maxDataCount];
            this.isNotFiltedRow = new boolean[maxDataCount];
            readIntoResultSet = new boolean [maxDataCount][titres.length];
            //copie des données à la fin du resulset dans le tableau au cas où l'utilisateur clique sur le bouton qui lui permet de se rendre directement tout en bas de la table  -> fait perdre 500ms à l'affichage de la fenêtre mais en fait gagner 1200 si clic sur le bouton
            /*for (int i = maxDataCount-1; i>maxDataCount-19; i--) {
                try {
                    data.absolute(i+1);
                    for (int j=0; j<dataCopy[0].length; j++) {
                        dataCopy[i][j] = data.getString(j+1);
                    }
                }
                catch( SQLException sql){System.out.println(i);sql.printStackTrace();}
            }*/
                   //Essai de faire l'action ci dessus (copie des dernières lignes) en background. 
    //ceci présente tout de même un problème : Concurrence sur le résultset avec getValueAt le fait de le positionner en haut lors de l'affichage de la fenêtre j'ai les données en haut en bas !
            sw = new SwingWorker () {
                @Override
                protected Object doInBackground() throws Exception {
                    System.out.println("doInBg");
                    for (int i = maxDataCount-1 ; i>=0; i--) {
                        //System.out.println(i);
                            if (!readIntoResultSet[i][0]) {
                                for (int j=0; j<dataCopy[0].length; j++) {
                                try {
                                    data.absolute(i+1);
                                    dataCopy[i][j] = data.getString(j+1);
                                    readIntoResultSet[i][j] = true;
                                }
                                catch( SQLException sql){System.out.println(i+"   "+j);sql.printStackTrace();}
                                }
                            }
                        }
                    return null;
                }
            };
            //sw.execute();
        }
    Ici, getValueAt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public Object getValueAt(int parm1, int parm2) {
            //System.out.println(parm1+"    "+parm2);
            if (!readIntoResultSet[parm1][parm2]) {//permet de savoir si la cellule contient déjà les données du resultset
                try {
                    data.absolute(parm1+1);
                    dataCopy[parm1][parm2] = data.getString(parm2+1);
                    readIntoResultSet[parm1][parm2] = true;
                }
                catch(SQLException npe){npe.printStackTrace();return null;}
                }
     
            return dataCopy[parm1][parm2];
    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
    30
    31
    32
     
     
    /**
         *
         * @param value to find into table
         * @return index where value is stored
         */
        public int addFilter(String value){
            int mediane = 0,
                    min=0, // first index
                    max= this.getRowCount()-1, //last index
                    goal = Integer.parseInt(value);
     
            int maxValue = Integer.parseInt(getValueAt(max,0).toString());
            int minValue = Integer.parseInt(getValueAt(min,0).toString());
            if(goal<= maxValue && goal>minValue) {//dichotomy is needed only if goal is between min value and max value
                while((max-min)>1){//dichotomy
                    mediane = (min+max)/2;
                    if(Integer.parseInt(getValueAt(mediane,0).toString())<goal) min = mediane;
                    else if(Integer.parseInt(getValueAt(mediane,0).toString())>goal)max = mediane;
                    else break;
                }//end dichotomy
                if(Integer.parseInt(getValueAt(mediane,0).toString())<goal) mediane++;
            }
            else if (goal>maxValue)
                mediane = max;
     
            else
                mediane = min;// loop is true while itr lte mediane in order to display everything, mediane = -1
            lastIndexFiltered = mediane;
            return mediane;
        }

  4. #44
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Citation Envoyé par oneagaindoguys Voir le message
    Jusqu'à 50 000 c'est correct, mais après, quand je descend d'un coup sec, la scroll se bloque et suis atteint le curseur de la souris 1 seconde après
    Ca ressemble à un probleme d'accumulation de commandes. Il faudrait verifier si, quand tu mets un coup de scroll bar, il y a des appels de getValueAt sur toutes les lignes intermediaires. Par exemple, si tu es en train d'afficher les lignes 1 à 10 et que tu scroll d'un coup à la ligne 10000, est ce qu'il va y avoir des appels entre 10 et 10000...

  5. #45
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Points : 532
    Points
    532
    Par défaut
    J'y avais pensé !

    J'ai fais l'expérience pour vous montrer que non. J'ai affiché ma table (0 -> 17). Puis j'ai donné un grand coup de la scroll pour la coller en bas. Elle s'est bloqué un peu après la moitié (les 114000 je pense)
    J'ai ici tous les numéros des lignes que getValueAt a reçu.

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
     
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    798
    799
    800
    801
    802
    803
    804
    805
    806
    807
    808
    809
    810
    811
    812
    813
    814
    815
    816
    14371
    14372
    14373
    14374
    14375
    14376
    14377
    14378
    14379
    14380
    14381
    14382
    14383
    14384
    14385
    14386
    14387
    14388
    14389
    116569
    116570
    116571
    116572
    116573
    116574
    116575
    116576
    116577
    116578
    116579
    116580
    116581
    116582
    116583
    116584
    116585
    116586
    193217
    193218
    193219
    193220
    193221
    193222
    193223
    193224
    193225
    193226
    193227
    193228
    193229
    193230
    193231
    193232
    193233
    193234
    Il y a 110 lignes soit exactement 1100 appels de getValueAt car j'ai 10 colonnes !

  6. #46
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    ce ne serait un problème du driver JDBC? Genre le protocole ne lui permet pas de scoller n'importe comment? Essaie de voir si, dans ton code, en lisant dans le constructeur la dernière row, ca ne remet pas tout à coup 7 secondes à mouliner?

  7. #47
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Points : 532
    Points
    532
    Par défaut
    Si ça se remet à mouliner mais pas 7 secondes mais 1600ms.

    J'ai essayé avec un autre driver, et ça met 110 !

  8. #48
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    en gros le scrollable resultset n'est pas vraiment scrollable. Si t'es coincé avec ce driver, il va falloir lire tes données par block (genre 100 lignes à la fois) et utiliser des commande SQL avec les instruction du genre "limit" pour limiter le nombre de résultat. Ca va être d'office plus sport

  9. #49
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Points : 532
    Points
    532
    Par défaut
    Non, je crois que les deux problèmes sont résolu, j'obtiens une table avec un temps de réponse inférieur à 3s (ça va au client) et et je me rends tout en bas en 110ms. Je crois que c'est bon.

    Lorsque je cherche une valeur, c'est très rapide, et sélectionne la ligne, sur ce que j'avais demandé, je suis satisfait.
    Maintenant, dernière chose que j'essaye d'optimiser, la bascule. Dans cette table, je vais sélectionner des ligne que je vais ajouter à une sélection (un peu comme on ajoute au panier)
    Il faut qu'après ça, je supprime la ligne concernée. J'arrive à ajouter le ligne dans la liste, mais je n'arrive pas encore à effacer la ligne.
    Je vais voir du coté de JTable et TableModel.
    Sinon je vais mettre un tableau de booléen qui correspond si oui ou non elle est effacé, et du coup, je créerais un décalage dans la table...

  10. #50
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 47
    Points : 50
    Points
    50
    Par défaut
    à mon avis tu as un problème de d'ergonomie de ton application. charger 200 000 lignes est trop important quelque soit la manière de tourner le problème. et de toutes façon je vois mal un utilisateur les parcourir toutes avec la molette (il risque d'y avoir des crampes ou des doigts hypermusclés ). la pagination est le mieux et plus légé en mémoire

  11. #51
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Points : 532
    Points
    532
    Par défaut
    Citation Envoyé par the_frogkiller Voir le message
    à mon avis tu as un problème de d'ergonomie de ton application. charger 200 000 lignes est trop important quelque soit la manière de tourner le problème. et de toutes façon je vois mal un utilisateur les parcourir toutes avec la molette (il risque d'y avoir des crampes ou des doigts hypermusclés ). la pagination est le mieux et plus légé en mémoire
    Je suis d'accord, mais le client insiste, cela n'est plus mon problème. Eh oui les clients sont parfois bizarres !
    Cela étant, tout est réglé, j'ai réussi à obtenir ma fenêtre en maximum 3 secondes, je peux la parcourir sans que ça rame, je recherche des valeurs (elles sont triées), je peux sélectionner des lignes et les ajouter dans une liste, tout est fluide. Le problème est résolu. Merci à vous !!

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 3 PremièrePremière 123

Discussions similaires

  1. [2000] Meilleure méthode pour insérer un grand nombre de lignes
    Par nicodev24 dans le forum Développement
    Réponses: 11
    Dernier message: 31/10/2016, 12h25
  2. Pb pour lire un grand nombre de données
    Par seb111983 dans le forum JDBC
    Réponses: 12
    Dernier message: 28/09/2010, 22h57
  3. Requête pour modifier un grand nombre d'entrée
    Par gatsu00 dans le forum Requêtes
    Réponses: 1
    Dernier message: 15/11/2007, 10h47
  4. Type PostgreSQL pour stocker des grands nombres
    Par K-Kaï dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 08/06/2006, 21h26
  5. [Stratégie] Manipulation d'un grand nombre d'objet
    Par Aldouille31 dans le forum Langage
    Réponses: 8
    Dernier message: 10/05/2006, 14h01

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