Chargement dans jlist très long

Résolu
dmfdmf Messages postés 38 Date d'inscription mardi 10 novembre 2009 Statut Membre Dernière intervention 15 avril 2012 - 18 févr. 2011 à 09:04
dmfdmf Messages postés 38 Date d'inscription mardi 10 novembre 2009 Statut Membre Dernière intervention 15 avril 2012 - 22 févr. 2011 à 16:44
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

cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
22 févr. 2011 à 09:23
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
3
cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
18 févr. 2011 à 09:25
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?
0
cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
18 févr. 2011 à 09:33
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???
0
dmfdmf Messages postés 38 Date d'inscription mardi 10 novembre 2009 Statut Membre Dernière intervention 15 avril 2012
18 févr. 2011 à 09:36
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dmfdmf Messages postés 38 Date d'inscription mardi 10 novembre 2009 Statut Membre Dernière intervention 15 avril 2012
18 févr. 2011 à 09:39
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
0
cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
18 févr. 2011 à 10: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.
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
18 févr. 2011 à 13:58
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
0
dmfdmf Messages postés 38 Date d'inscription mardi 10 novembre 2009 Statut Membre Dernière intervention 15 avril 2012
21 févr. 2011 à 15:38
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
0
cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
21 févr. 2011 à 16:41
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
0
dmfdmf Messages postés 38 Date d'inscription mardi 10 novembre 2009 Statut Membre Dernière intervention 15 avril 2012
21 févr. 2011 à 17:03
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
0
cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
21 févr. 2011 à 17:20
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...
0
dmfdmf Messages postés 38 Date d'inscription mardi 10 novembre 2009 Statut Membre Dernière intervention 15 avril 2012
21 févr. 2011 à 17:56
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
0
dmfdmf Messages postés 38 Date d'inscription mardi 10 novembre 2009 Statut Membre Dernière intervention 15 avril 2012
22 févr. 2011 à 16:44
Bonjour Jonathan,

Merci pour ton aide précieuse :-)

Sujet résolu.

Amicalement,
DMF
0
Rejoignez-nous