Performance de lecture de plusieurs XML

Salut,
J'ai une petite question performances.
Je le mets dans la rubrique commune même si c'est destiné à l'iPhone.
Au lancement de l'application, je voudrais parcourir entre 20 et 50 dossiers de la sandbox qui possèdent chacun un fichier xml descriptif de leur contenu (qui porte le même nom dans chaque dossier). Chaque fichier XML a une trentaine de lignes.
Le but est de créer un array du contenu de tous ces fichiers xml et de l'exploiter dans l'application. Plus loin dans l'application, on pourra télécharger d'autres dossiers à mettre dans la sandbox et donc "augmenter" un peu la taille de l'array de XML.
Une autre option était de créer une minibase SQLite ou bien même juste 1 seul fichier XML qui contient tous les autres au moment où on remplit la sandbox et/ou au moment où on télécharge un nouveau dossier.
Mais comme je suis fainéant, je voulais savoir si la première solution pouvait suffire (je pense que oui car parcourir un dossier qui en contient 30 autres et concaténer 30 fichiers XML dans un seul doit pas être trop gourmand).
J'ajoute que les XML ne sont pas des PLISTS.
Quelle stratégie adopteriez-vous ?
J'ai une petite question performances.
Je le mets dans la rubrique commune même si c'est destiné à l'iPhone.
Au lancement de l'application, je voudrais parcourir entre 20 et 50 dossiers de la sandbox qui possèdent chacun un fichier xml descriptif de leur contenu (qui porte le même nom dans chaque dossier). Chaque fichier XML a une trentaine de lignes.
Le but est de créer un array du contenu de tous ces fichiers xml et de l'exploiter dans l'application. Plus loin dans l'application, on pourra télécharger d'autres dossiers à mettre dans la sandbox et donc "augmenter" un peu la taille de l'array de XML.
Une autre option était de créer une minibase SQLite ou bien même juste 1 seul fichier XML qui contient tous les autres au moment où on remplit la sandbox et/ou au moment où on télécharge un nouveau dossier.
Mais comme je suis fainéant, je voulais savoir si la première solution pouvait suffire (je pense que oui car parcourir un dossier qui en contient 30 autres et concaténer 30 fichiers XML dans un seul doit pas être trop gourmand).
J'ajoute que les XML ne sont pas des PLISTS.
Quelle stratégie adopteriez-vous ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Ca dépend en fait de ce que tu attends comme perfs, et ce que tu considères comme acceptable.
- Un PLIST ou une NSArchive me semblent plus optimaux à parser qu'un XML
- La concaténation de deux XMLs ne fait pas un XML valide (d'une part à cause de l'en-tête XML, d'autre part parce qu'un XML valide n'a qu'une seule racine)
- Mais bon après si ton parsing de chaque XML n'est pas trop long ça ne devrait pas être trop génant
- A mon avis c'est un cas typique où tu peux considérer utiliser GCD. Rien qu'en parallélisant les analyses de tous les dossiers (suffit d'utiliser NSOperation ou même la méthode enumerateWithBlock de NSArray pour boucler sur ton tableau de dossiers, ça utilisera GCD implicitement sans que ça te perturbe plus que ça)
Et hop, une utilisation implicite de GCD en faisant des boucles concurrentes (parallèles)
Pas mal la piste de GCD, sauf que je suis sur iPhone.
Cependant, je partage ton analyse sur le PLIST et sa rapidité vis à vis du XML à parser à chaque fois...
Je pense donc remplir un PLIST général à la volée avec les XML (au premier lancement de l'application pour ce qui est livré avec l'appli et à chaque téléchargement pour le reste). Donc parser une seule fois le XML.
Pour répondre à ta question, "quelle solution adopteriez-vous", ma réponse est toujours la même: "la plus simple". Les utilisateurs préfèrent un logiciel imparfait demain qu'un logiciel parfait dans des mois. Réfléchis-y: garantir la synchro entre ces petits XML et un gros fichier central n'est pas si simple.
Commence par lire les 50 XML et seulement si c'est trop lent, règle le problème.
(Bon ok que depuis iOS 4.0, mais bon, je kiffe tellement les blocks et les possibilités qu'ils offrent :P)
ça alors !
Je l'avais passé à la trappe !
Mais bon, je voulais rendre l'application (pour un client) compatible avec le 3.2.
C'est vrai que je trouve le SQL plus souple qu'un PLIST et en plus j'ai l'habitude de travailler avec. J'ai l'impression d'avoir un peu tous les choix. :-)
C'est ce que je me disais, mais bon, j'y vois pas trop de contraintes non plus.
juste pour info c'est les blocks qui sont supportés par iOS 4 ou GCD?
Le principe de GCD repose sur des unités de travail qui sont automatiquement dispatchées par GCD sur les threads et les "dispatch_queues". Ces unités de travail sont représentées par des blocks.
Autrement dit GCD utilise les blocks, donc si un OS supporte GCD, faut déjà qu'il supporte les blocks (un OS pourrait supporter les blocks sans supporter GCD, mais aujourd'hui à la fois OSX.6 et iOS4 supportent GCD et les blocks depuis la même version, ils sont apparus en même temps dans les dernières versions des OS d'Apple)
---
Moi depuis qu'ils existent j'utilise pas mal les blocks y compris sous iOS, au début ça peut être un peu déroutant mais c'est vraiment puissant et simplifie grandement les choses en pratique. En particulier pour remplacer les callbacks. Par exemple pour demander une ressource réseau de façon asynchrone, plutôt que de réimplémenter à chaque fois une classe avec NSMutableData et implémenter NSURLRequestDelegate et tout, on peut prévoir une classe qui s'utilise du genre : Ce que je trouve quand même plus sexy que d'avoir à implémenter chaque méthode du protocole, donc dans des méthodes séparées qui ne sont du coup pas forcément à côté du code qui lance la requête : au final avec les blocks tout est groupé et c'est plus lisible je trouve, pas vous ?
En plus ça a l'avantage si on veut lancer plusieurs téléchargements depuis le même objet de ne pas avoir de souci (car sinon quand on implémente "connection:didReceiveData:" etc. alors qu'on a lancé plusieurs NSURLConnection avec le même delegate, comment savoir de quelle requête il s'agit ?)
Bon, c'est vrai, c'est limité à iOS4... Mais quand même, qu'est ce que c'est bien
Tiens, je croyais que GCD avait du mal à décoller... mais je dois confondre avec OpenCL qui a du mal à devenir un standard ?
C'est l'API de haut niveau qui en fait sa force et qui fait qu'on l'utilise de façon relativement intuitive. Savoir qu'au lieu d'écrire Il suffit d'écrire Pour transformer une boucle sur un tableau de boucle synchrone (itératif et en série) à une boucle concurrente (où chaque itération est faite en parallèle).... sans avoir à se poser des questions sur le multithreading ou avoir à créer des NSThreads ou autre... c'est beau :P
A vrai dire c'est GCD, donc il dispatch, sur différents threads, ces threads pouvant être répartis sur plusieurs cores, selon les priorités inférées par les threads créés et les autres opérations pouvant éventuellement être dispatchées sur la même dispatch_queue et tout... bref toute la mécanique du thread scheduling qui suit comme d'hab des règles et algos complexes pour un scheduling optimal en fonction des priorités des tâches et des temps CPU de chacun et des "nice" de chaque process tout en évitant les inversions de priorité et les gérant les dépendances et tout... bref la prise de tête... bah c'est GCD qui s'en charge !
Tout ce qu'il y a à savoir c'est qu'il faut au mieux, il se débrouille tout seul, y'a pas à se prendre la tête c'est ça la beauté de GCD ! (Et si tu as déjà eu des cours de multithreading tu sauras à quel point c'est qqch qui peut soulager :P)
ça donne envie de faire des applications bien optimisées du coup... (enfin, plutôt sur mac pour bien profiter des coeurs justement)
Si j'ai déjà eu des cours de programmation plutôt... ah oui, en 2000 et 2001, un peu de C à l'IUT glande. Et c'est tout. ;D