Ich hatte auch mal mit etwas größeren XML-Dateien zu tun.
Das Problem (bzw. meine Erklärung dafür) ist folgendes: Um den nächsten Subtree auszulesen, musst du zunächst den vorigen zu Ende lesen, da du nur dann weißt, dass er euch zu Ende ist.
Du kannst in einem XML nicht einfach zum passenden End-Tag springen ohne den Teil dazwischen zu lesen (und darin Start- und End-Tags zu verfolgen).
Was mir geholfen hat, war wirklich nur die benötigten Teile als XElement zu parsen und am Rest möglichst vorbei zu lesen. Zum Beispiel:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| while (reader.Read() && reader.NodeType == XmlNodeType.Element && reader.LocalName == "ABC") { using (var subtree = reader.ReadSubtree()) { var xmlNode = XElement.Load(subtree); var abc = ABC.FromXElement(xmlNode , _internalState); this.ABCs.Add(abc); } } |
Wobei du in diesem Beispiel natürlich den xmlNode als Task (parallel) verarbeiten kannst. Ich habe mich damals nicht sehr um multithreading beim parsen einer Datei bemüht, da ich typischerweise mehrere Dateien parsen musste und da parallelisieren konnte.
Hast du eigentlich mal den Profiler genutzt um zu sehen, wo genau die Zeit bleibt? Ich meine, bei mir gingen damals 20MB in einer halben Sekunde...