Aller au contenu

[RESOLU] Chargement d'un gros XML (1600 entrées) dans un ArrayList


Recommended Posts

Bonjour!

Je développe actuellement une application ayant besoin de télécharger des données (XML).

Je les charges de la manière suivante : http://android-france.fr/2009/05/07/developpez-une-application-pour-android-etape-11-xml-et-android/

Document document = constructeur.parse(myURL.openStream());
 Element racine = document.getDocumentElement();
 NodeList liste = racine.getElementsByTagName("recette");
 //remplissage de mon tableau
 for(int i=0; i      ArrayList aTableauTmp =  new ArrayList(); 
     Element E1= (Element) liste.item(i);
     //aTableRetour[i]= "";
     aTableauTmp.add(E1.getAttribute("nom"));
     aTableauTmp.add(E1.getAttribute("contenu"));
     aTableRetour.add(aTableauTmp);
 }

Le soucis est que le XML contient 1600 occurences, la boucle est longue... très longue.

Lorsque je fais un Log de i, je vois qu'environs 4-5 lignes du fichier sont traitées par seconde et que le Garbage Collector est appelé toutes les 2 secondes.

J'aimerais savoir si j'ai raté une marche car je ne pense pas que celà soit très normal.

Avez-vous des idées?

Lien vers le commentaire
Partager sur d’autres sites

Oui, quand j'entend 1600 occurences c'est de la forme






      x1600

Y-a-t-il un autre moyen? Je pensais que le XML était un bon moyen pour l'échange de données!

Le fichier ne pèse que 170Ko, c'est son traitement qui est long, je crois que j'ai raté un truc!

Peux-tu m'éclairer :D ?

Lien vers le commentaire
Partager sur d’autres sites

Personellement j'aurai évité de déclarer Element El à l'intérieur de la boucle , pour justement éviter le garbage colector (et l'ArrayList aussi).

Après je suis pas super calé a ce niveau donc il se peut que ça change rien

Document document = constructeur.parse(myURL.openStream());
 Element racine = document.getDocumentElement();
 NodeList liste = racine.getElementsByTagName("recette");
 //remplissage de mon tableau
 Element E1= null;
 ArrayList aTableauTmp  = null;
 for(int i=0; i      aTableauTmp =  new ArrayList(); 
     E1= (Element) liste.item(i);
     //aTableRetour[i]= "";
     aTableauTmp.add(E1.getAttribute("nom"));
     aTableauTmp.add(E1.getAttribute("contenu"));
     aTableRetour.add(aTableauTmp);
 }

Lien vers le commentaire
Partager sur d’autres sites

Salut eephyne!

J'ai essayé de commenter tout l'intérieur de la première boucle, en affichant i, je m'apercois que le téléphone parcour le NodeList en à peine 1s. C'est donc le chargement dans les ArrayList qui consome énormément.

Merci pour ta réponse, j'ai ensuite essayé en déclarant E1 et E2 à l'extérieur des boucles, mais cela ne change pas grand chose au problème initial.

Mes éléments membres dispose de coordonnées géographiques, l'intérêt est de localiser sur 20 km, alors je vais tenter de parcourir la liste et de ne charger que ceux voulus, une sorte de mixe entre les deux. Je pense pouvoir obtenir des performances recevable.

Je vous tiens au courant, merci pour vos interventions

Lien vers le commentaire
Partager sur d’autres sites

petit plus....si tu fais new ArrayList(2048), tu accélèrera ton traitement.

je ne suis plus sûr de la façon dont il est implémenté mais en général ce genre de collection commence par défaut avec une taille 0.

puis 2 (la reference est détruite et recopiée dans un nouvel objet).

puis, 4, 8, 16,.....

à chaque fois que tu dépasse la nouvelle taille, celle ci est doublée...ce qui consomme énormément dès que tu atteinds un certain nombre d'enregistrements, vu que tout est recopié à chaque dépassement.

donc aTableauTmp = new ArrayList(2);

et aTableauRetour = new ArrayList(2048)

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...