com.hero Posté(e) 10 juin 2010 Share Posté(e) 10 juin 2010 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 More sharing options...
Sylvain-a Posté(e) 10 juin 2010 Share Posté(e) 10 juin 2010 Un doc xml de 1600 occurrences o_O? Lien vers le commentaire Partager sur d’autres sites More sharing options...
com.hero Posté(e) 10 juin 2010 Auteur Share Posté(e) 10 juin 2010 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 More sharing options...
eephyne Posté(e) 11 juin 2010 Share Posté(e) 11 juin 2010 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 More sharing options...
com.hero Posté(e) 11 juin 2010 Auteur Share Posté(e) 11 juin 2010 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 More sharing options...
com.hero Posté(e) 11 juin 2010 Auteur Share Posté(e) 11 juin 2010 La solution était la bonne. en ne prenant que les points intéressant à 20km j'obtiens ma liste entre 6 et 20s ce qui me convient parfaitement. Problème résolu Lien vers le commentaire Partager sur d’autres sites More sharing options...
popolbx Posté(e) 12 juin 2010 Share Posté(e) 12 juin 2010 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 More sharing options...
com.hero Posté(e) 14 juin 2010 Auteur Share Posté(e) 14 juin 2010 Salut Popolbx! Merci pour l'info, ca accélérera encore un peu le traitement! Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.