Quel est le moyen le plus rapide pour charger des données XML dans un XDocument?
Lorsque vous créez un nouveau XDocument
à l'aide de XDocument.Load
, n'est-il ouvert le fichier XML et en garder une copie locale, ou il continue de lire le document à partir du disque dur? Si elle ne continue de lire, est-il un moyen plus rapide pour parser du XML?
XDocument x = XDocument.Load("file.xml");
Vous devez vous connecter pour publier un commentaire.
Il ya un couple de mesures à envisager:
Pour répondre à la question immédiate:
XDocument
utilise unXmlReader
de charger le document dans la mémoire par la lecture de chaque élément et de la création d'correspondantXElement
cas (voir le code ci-dessous). En tant que tel, il devrait être assez rapide (assez rapide pour la plupart des cas), mais il peut consommer une grande quantité de mémoire lors de l'analyse d'un document volumineux.Un raw
XmlReader
est un excellent choix pour la traversée si vos besoins sont limités à ce qui peut être fait sans conserver le document dans la mémoire. Il sera mieux que d'autres méthodes car aucune structure importante est créé ni résolu en relation avec d'autres nœuds (par exemple, en reliant des nœuds parents et enfants). Toutefois, à la demande de requête de capacité est presque inexistant; vous pouvez réagir à des valeurs que l'on retrouve dans chaque nœud, mais vous ne pouvez pas interroger le document dans son ensemble. Si vous avez besoin de regarder le document une deuxième fois, vous avoir à traverser toute chose de nouveau.Par comparaison, une
XDocument
prendra plus de temps pour traverser parce qu'il instancie des objets et effectue de base des tâches structurelles. Il permettra également de consommer de la mémoire proportionnelle à la taille de la source. En échange de ces échanges, vous bénéficiez d'un excellent requête capacités.Il peut être possible de combiner les approches, comme mentionné par Jon Skeet et illustré ici: Streaming En LINQ to XML à l'Aide de C# Personnalisé Itérateurs et XmlReader.
Source pour XDocument Load()
Il analyse le flux entrant (si c'est à partir d'un fichier ou d'une chaîne de caractères n'a pas d'importance) lorsque vous appelez
Load()
et le conserver à une instance locale du document en mémoire. Depuis la source peut être n'importe quoi (peut être une NetworkStream, un DataReader, une chaîne entrée par l'utilisateur), il ne pouvait pas revenir en arrière et essayer de lire les données à nouveau, car elle ne sais pas l'état de celui-ci (flux en cours de fermeture, etc).Si vous voulez vraiment de la vitesse sur l'autre main, XDocument n'est pas le fastets (tous bien que c'est plus facile à travailler), puisqu'il faudra d'abord analyser le document et de le conserver en mémoire. Si vous travaillez avec des documents de grande taille à l'aide d'une approche avec Système.Xml.XmlReader est généralement beaucoup plus rapide car il peut lire le document comme un flux et n'a pas besoin de conserver de tout, sauf de l'élément actuel. Cette référence montre quelques chiffres intéressants à ce sujet.
Je ne pense pas que c'lit en permanence; la bonne chose à propos de la
XDocument.Load
méthode est qu'elle utiliseXmlReader
pour lire le fichier XML dans un arbre XML. Et puisque maintenant vous venez de créer un arbre qui est probablement stocké dans votre mémoire comme un arbre, il ne lit plus le document en permanence. Il manipule l'arbre et depuis c'est un arbre à tous de votre lecture et de modification sont fait beaucoup plus rapidement. Bien qu'il ne pas mettre en œuvreIDisposable
il est automatiquement éliminé.