Comment résoudre le XML parsing problème de performance sur Android
Je dois lire un fichier XML avec environ 4000 lignes sur Android. J'ai d'abord essayé la SimpleXML bibliothèque parce qu'il est plus facile et il a fallu environ 2 minutes sur mon HTC Desire. Alors j'ai pensé que peut-être SimpleXML est si lent à cause de la réflexion et de tous les autres de la magie que cette bibliothèque utilise. J'ai réécrit mon analyseur et utilisé le built-in DOM l'analyse de la méthode avec une attention particulière pour la performance. Qui a aidé un peu, mais il a fallu environ 60 secondes, ce qui est encore totalement inacceptable. Après un peu de recherche, j'ai trouvé cet article sur developer.com. Il y a quelques graphes qui montrent que les deux autres méthodes disponibles - l'analyseur SAX et Android XML Pull-Parser - sont tout aussi lent. Et à la fin de l'article vous trouverez la déclaration suivante:
La première surprise que j'ai eu était à la lenteur de l'ensemble des trois méthodes ont été. Les utilisateurs
vous ne voulez pas attendre longtemps pour les résultats sur les téléphones mobiles, de sorte que l'analyse
rien de plus que quelques dizaines de dossiers peuvent donner mandat à une autre méthode.
Ce que pourrait être un "autre méthode"? Que faire si vous avez plus que "quelques dizaines de dossiers"?
Je n'ai pas à lire l'ensemble du dossier à la fois. Mais cela rend les choses plus faciles. Il n'y a pas d'autre solution pour le problème de performance? 4000 lignes ne semble pas trop grand pour moi ... ou au moins, il ne devrait pas être trop gros
Sur Android il y a des problèmes de performances à l'aide d'annotations. Les récents communiqués sur Simple (2.6.6) ont résolu ces problèmes. Si vous mettez à niveau la bibliothèque que vous utilisez, alors vous pourriez voir des améliorations de l'ordre de 10 fois.
OriginalL'auteur Korbi | 2011-08-28
Vous devez vous connecter pour publier un commentaire.
Réponse originale à cette question, en 2012
(remarque: assurez-vous de lire l'2016 mise à jour ci-dessous!)
Je viens de faire quelques tests de perf en comparant les analyseurs sur Android (et d'autres plates-formes). Le fichier XML pour être analysée n'est que de 500 lignes (une recherche Twitter flux Atom), mais de Traction et DOM l'analyse peut turbiner environ 5 ces documents d'une seconde sur un Samsung Galaxy S2 ou Motorola Xoom2. SimpleXML (en rose dans le tableau) que celui utilisé par les OP des liens pour de faibles avec DOM l'analyse.
SAX Analyse est un ordre de grandeur plus vite sur mes deux appareils Android, la gestion de 40 docs/sec mono-thread, et 65+/sec multi-thread.
Android 2.3.4:
La code est disponible sur github, et une discussion ici.
Mise à jour le 18 Mars 2016
OK, donc sa fait presque 4 ans et le monde a évolué. J'ai enfin réussi à ré-exécuter les tests sur:
Quelque part entre Android 4.4.4 et Android 6.0.1 la situation a radicalement changé et nous avons un nouveau gagnant: Tirez l'Analyse FTW à plus de deux fois le débit de SAX. Malheureusement, je ne sais pas exactement quand ce changement est arrivé comme je n'ai pas tout les appareils fonctionnant sous Android > 4.4.4 et < 6.0.1.
Android 4.1.2:
Android 4.4.4:
Android 6.0.1:
Si vous voulez juste pour exécuter les tests sur un appareil Android, vous pouvez télécharger le pré-construit apk à partir de github. Si vous souhaitez affiner les tests un peu plus de travail, mais il n'y a pas beaucoup de depenencies, de sorte que vous pourrait assez facilement re-gabarit de l'éclipse classpath et pas besoin de maven.
merci! Je vais essayer ça
Merci pour le test de Stevie. Quelle version d'Android avez-vous utilisé pour le test? Avez-vous une idée de pourquoi Tirer de l'analyseur est si lente à android? Il semble qu'a un bug quelque part parce que je m'attendais similaire SAX performance. Il peut être un bug dans XmlPullParser avant ICs android-développeurs.blogspot.com.es/2011/12/...?
Au moment où j'ai été le tester sur 2.3.4 - je n'ai pas essayé de ré-exécuter sur des versions plus récentes. Si je trouve le temps je vais re-tester sur le même appareil sous ICS et publier les résultats.
OriginalL'auteur
Je pense que la meilleure façon de travailler avec XML sur Android est l'utilisation VDT-bibliothèque XML
Mon fichier XML contient plus de 60 000 lignes et VDT-XML gère comme suit:
Nexus 5 : 2055 millisec
Galaxy Note 4 : 2498 milisec
Vous pouvez trouver plus de référence des rapports en lien : VTD-XML de Référence
Court exemple de fichier XML
La Configuration de "construire.gradle" fichier
Exemple de code Source:
Résultat
il fonctionne pour moi et j'espère qu'il vous aide.
mais être conscient de la licence (GNU)
OriginalL'auteur
À l'aide de l'analyseur SAX, je peux analyser un 15,000 ligne fichier XML dans environ 10 secondes sur mon HTC Desire. Je soupçonne qu'il ya un autre problème en cause.
Êtes-vous d'enrichir une base de données dans le fichier XML? Si oui, êtes-vous souvenir d'envelopper l'ensemble de votre opération d'analyse dans une DB transaction? Qui, seul, peut accélérer les choses d'un ordre de grandeur.
OriginalL'auteur
Si vous analysez les Dates dans votre XML qui peut considérablement ralentir votre analyse. Avec les versions les plus récentes d'Android, cela devient de moins en moins un problème (comme ils l'ont optimisé le chargement de fuseau horaire info)
Si vous avez des Dates qui sont en train d'être analysé et vous n'en avez pas besoin, alors vous pouvez utiliser un parser SAX et ignorer tout de la Date éléments.
Ou si vous pouvez changer votre schéma XML, pensez à stocker les Dates comme des entiers plutôt que des chaînes formatées.
Vous l'avez mentionné, vous faites des comparaisons de chaînes, cela peut être assez cher. Peut-être envisager d'utiliser une table de hachage pour les chaînes de la comparaison, ce qui peut donner sensiblement les performances de benifits.
J'ai remarqué que l'un de vos autres commentaires que vous faites des comparaisons de chaînes, celles-ci peuvent être coûteux si vous faites beaucoup de sorte qu'il pourrait être intéressant d'enquêter sur l'utilisation d'une table de hachage
OriginalL'auteur
Il est très difficile de vous dire pourquoi votre code est lent sans voir ton code, et il est très difficile de croire que votre affirmation que la lenteur est due à l'analyseur XML lorsque vous n'avez pas fourni les détails de toutes les mesures pour le prouver.
Vos deux chiffres et ceux de l'developer.com site semblent incroyablement lent; il est intéressant de contraster avec la radicalement différentes figures (beaucoup plus proche de ce que je m'attends) être donné dans d'autres réponses à ce post. Il serait vraiment agréable de savoir ce qui se passe ici.
Je suis enclin à l'arrière ng théorie, au moins jusqu'à preuve du contraire: c'est le téléchargement qui est prendre le temps, pas l'analyse.
OriginalL'auteur
nous sommes l'aide de la traction-analyseur de façon très efficace pour 1 mo de Fichiers XML, et qu'ils sont lus dans environ 10 à 20 Secondes sur mon Désir. Donc, si votre code est correct, la vitesse sera ainsi. Il est évident que DOM est très lent sur une mémoire limitée de l'environnement, mais de tirer ou de SAX ne sont pas vraiment
OriginalL'auteur
Si votre analyse à partir d'une Prise de son de l'I/O c'est prendre le temps, pas l'analyse. Essayez de consommer les données d'abord, ensuite d'analyser une fois chargé et de mesurer la performance. Si le fichier est trop gros alors envisager une BufferedInputStream avec une très grande mémoire tampon, ce qui devrait améliorer les performances pour vous.
J'ai un très sérieux doute Simple XML va prendre 2 minutes pour charger 4000 lignes, je me rends compte d'un combiné est va être beaucoup plus lent qu'un poste de travail, cependant je peux charger les 200 000 lignes de code XML dans 600ms sur mon poste de travail.
OriginalL'auteur
Plutôt que d'en faire un processus synchrone, faire asynchrone. Vous pouvez avoir un bouton qui lance une IntentService qui va traiter les données pour vous et mettra à jour les résultats et afficher une notification quand il est fait. De cette façon, vous n'arrêtez pas de le thread d'INTERFACE utilisateur.
OriginalL'auteur