Chargement dans jlist très long [Résolu]

Signaler
Messages postés
38
Date d'inscription
mardi 10 novembre 2009
Statut
Membre
Dernière intervention
15 avril 2012
-
Messages postés
38
Date d'inscription
mardi 10 novembre 2009
Statut
Membre
Dernière intervention
15 avril 2012
-
Bonjour à tous,

je charge un jlist depuis un fichier qui contient environ 200 000 lignes.
cela prend environ 25 minutes à charger !?
Normal !??
mon code :
FileReader fichier  = new FileReader(MonFichierDxf);
              BufferedReader buf = new BufferedReader(fichier);
              String ligne = buf.readLine();

        while (ligne!=null){
            listeDXF.add(ligne);
            ligne = buf.readLine();
         }
        buf.close();

il y a-t-il une autre façon de faire ?

DMF

13 réponses

Messages postés
519
Date d'inscription
mercredi 21 mars 2007
Statut
Membre
Dernière intervention
19 décembre 2016
24
Salut,

En java 1.4, le plus "élégant", à mon avis, est :
Iterator iterateurDXF = listeDXF.iterator();
String dxf;

while (iterateurDXF.hasNext()) {
   dxf = (String) iterateurDXF.next();
   ...
}

Sinon avec le for, le plus simple est :
int nombreDXF = listeDXF.size();
String dxf;

for (int indexDXF = 0; indexDXF < nombreDXF; indexDXF++) {
   dxf = (String) listeDXF.get(indexDXF);
   ...
}


Bonne continuation,
Jonathan
Messages postés
519
Date d'inscription
mercredi 21 mars 2007
Statut
Membre
Dernière intervention
19 décembre 2016
24
Salut,

Non ce n'est pas normal.
Quel est le type de ta liste?
La taille de ton fichier?
Le fichier est sur un disque dur? quel modèle?
Quel version de java? OS?
Quel processeur, mémoire vive?
Messages postés
519
Date d'inscription
mercredi 21 mars 2007
Statut
Membre
Dernière intervention
19 décembre 2016
24
Oups, je viens de voir une JList.

Dans ce cas il y a une autre façon de procéder.
Crée un DefaultListModel, si tu connais à l'avance le nombre de lignes tu peux faire un appel à ensureCapacity(xxxx) sur ton modèle.
Tu ajoutes ensuite les lignes dans ce modèle.
Ensuite seulement, une fois que tu as rempli le modèle de la liste, tu peux faire :

JList liste = new JList(modele);

Par contre je ne sais pas quelle est la pertinence d'afficher 200'000 lignes sur une IHM???
Messages postés
38
Date d'inscription
mardi 10 novembre 2009
Statut
Membre
Dernière intervention
15 avril 2012

Bonjour Jojolemariole,

mon fichier est de type texte et contient environ 200000 lignes
d'environ 20 caractères
le fichier est sur le disque dur
java jdk 1.4
testé sur pc et mac (même résultat)
le pc à 2 ans et le mac 1 an (mémoire vive 4gb)

DMF
Messages postés
38
Date d'inscription
mardi 10 novembre 2009
Statut
Membre
Dernière intervention
15 avril 2012

je ne connais pas le nombre de ligne de chaque fichier.
je charge toutes ces lignes dans un jlist pour pouvoir travailler
sur chaque ligne indépendamment du fichier.

DMF
Messages postés
519
Date d'inscription
mercredi 21 mars 2007
Statut
Membre
Dernière intervention
19 décembre 2016
24
Re, essaie quand même de passer par un DefaultListModel, sans faire appel à ensureCapacity. Dis-moi le temps que ça prend de cette manière.
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
111
Salut,

Ta façon de procéder n'est pas la bonne : tu force le JList à se raffraichir à chaque nouveau ajout, donc c'est normal que ca mette du temps, comme te le suggère notre ami jojolemariole, passe par un ListModel, charge-y tes données puis applique le à ton JList une fois le model remplit et ca devrait être bien plus rapide, mais bon... charger 200 000 lignes dans une ihm, je me demande moi aussi à quoi ca peut bien servir ??? Ca m'étonnerai que l'utilisateur s'amuse à scroller pour sélectionner un item, fait plutôt un champ texte avec auto-complétion.
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
Messages postés
38
Date d'inscription
mardi 10 novembre 2009
Statut
Membre
Dernière intervention
15 avril 2012

Bonjour Darksidious,

l'utilisateur n'a pas accès à ce jlist,
je récupère les lignes du fichier dans ce jlist pour pouvoir faire des calculs sur chaque ligne.
Je vais tester avec ListModel.

DMF
Messages postés
519
Date d'inscription
mercredi 21 mars 2007
Statut
Membre
Dernière intervention
19 décembre 2016
24
Salut,

Je me permets de répondre.
Si tu ne souhaites pas présenter cette liste à l'écran, pourquoi utiliser une JList qui est un composant graphique et donc beaucoup plus lourd?
Utilise une ArrayList par exemple, en termes de performances ce sera le jour et la nuit.

Jonathan
Messages postés
38
Date d'inscription
mardi 10 novembre 2009
Statut
Membre
Dernière intervention
15 avril 2012

Bonjour Jonathan,

je pense que tu as raison pour les performances en passant par un ArrayList au lieu de passer par un jlist mais :
"ArrayList<String> listeDXF = new ArrayList<String>();"
les "<>" sont à partir de java 5
par obligation je ne dépasse pas jdk 1.4

Merci pour l'aide,

Amicalement,
DMF
Messages postés
519
Date d'inscription
mercredi 21 mars 2007
Statut
Membre
Dernière intervention
19 décembre 2016
24
Ce n'est pas un problème, les ArrayList existaient bien avant Java 1.5.

Une déclaration correcte cacherait plutôt l'implémentation (ArrayList) :

List listeDXF = new ArrayList();

par la suite, ceci sera correct :

String chaine = "blabla"
listeDXF.add(chaine);

mais pas ceci :

String chaine = listeDXF.get(i);

car les listes ne sont pas typées avant Java 1.5, et la méthode get retourne un Object, il faut "caster" :

String chaine = (String) listeDXF.get(i);

Au passage, quelle plaie de travailler avec Java 1.4, c'est un client qui vous impose ça? Je dis ça parce que je suis dans ce cas, mon client envisage seulement maintenant de passer à Java 1.5...
Messages postés
38
Date d'inscription
mardi 10 novembre 2009
Statut
Membre
Dernière intervention
15 avril 2012

Merci Jonathan !!

mon temps de chargement est passé de minutes en secondes !! :-)

Par-contre l'utilisation en jdk 1,4 n'est pas evident :(

par exemple pour utiliser une boucle on fait :
for (i= 0; i<=listeDXF. size()-1 ; i++)
ou
for (i =0; i<=listeDXF.size(); i++)

JDK 1,4 imposé par plusieurs clients qui conservent d'anciens mac sans connection internet, donc pas de mise à jour possible :(

Bienvenu dans ma galère :)

Amicalement,
DMF
Messages postés
38
Date d'inscription
mardi 10 novembre 2009
Statut
Membre
Dernière intervention
15 avril 2012

Bonjour Jonathan,

Merci pour ton aide précieuse :-)

Sujet résolu.

Amicalement,
DMF