dirmhirn
Goto Top

XML Join mit Powershell - speedup?

Hi,

ich muss zwei Tabellen in XML Form mit einer 1:n-Verbindung verknüpfen. (d.h. es geht nicht darum zwei XML Dateien zusammenzufügen)

Mit Powershell konnte ich das soweit umsetzen. Ich geh alle Nodes der größeren XML Datei durch und suche jedesmal in der kleineren den entsprechenden Node.

Die Performance ist ok... 150k Nodes in 15min
Ein Ansatz wäre XmlReader statt XmlDocument zu nutzen da hier ein Index erstellt werden kann. Aber das scheint deutlich aufwendiger zu werden als mit XmlDocument.

Gibt es auch mit XmlDocument einen schnelleren Weg, um einen Node mit bestimmtem ChildNode zu finden?

<root>
  <node>
     <id>
     <detail1>
     <detail2>
  <node>
...

#$ID-node, tag Name des Nodes mit der entprechenden ID.
#xmlsrc, Info
#xmldst, hier sind viele Nodes mit einem ID Feld über das der entsprechende Eintrag aus xmlsrcgeuscht werden soll

foreach ($node in $xmldst.SelectNodes(./root/node)) {

	# ID in dest
	$search= $node.SelectSingleNode(./id).InnerText
	
	# search id in source file
	$nodesrc = $xmlsrc.SelectSingleNode(./rootsrc/node/[./id =  $search]) # diese Zeile optimieren?

        #alle ChildNodes des gefunden Nodes in XMLdest kopieren
...

sg Dirm

Content-Key: 282497

Url: https://administrator.de/contentid/282497

Printed on: April 25, 2024 at 16:04 o'clock

Mitglied: 122990
Solution 122990 Sep 10, 2015 updated at 11:05:35 (UTC)
Goto Top
Moin,
schon mal mit diesem XPath probiert ?
"./rootsrc/node/id[.= '$search']"
Gruß grexit
Member: Dirmhirn
Dirmhirn Sep 10, 2015 at 11:05:31 (UTC)
Goto Top
Hi grexit,

danke für den Tip - weitere -%5 bei der Gesamtdauer.

fand es auch etwas überraschend, das //node deutlich langsamer (~50%) ist als ./rootsrc/node obwohl die Datei nur aus diesen Nodes besteht....

sg Dirm
Member: Dirmhirn
Dirmhirn Sep 21, 2015 at 09:40:41 (UTC)
Goto Top
Hi,
Hast du Erfahrung mit indizierten XML-Dateien oder ob CSV-Dateien schneller durchsucht werden können? Im Web finden sich einige Beiträge zu indizierten XML Dateien, der Code ist aber deutlich aufwendiger.
Irgendwie befürchte ich aber auch, dass ich hier an die Grenzen von Skript-Sprachen stoße.
sg Dirm
Mitglied: 122990
122990 Sep 21, 2015 at 10:46:12 (UTC)
Goto Top
Moin,
lade die XML doch in ein In-Memory-Database (DataTable-Objekt), filtere sie und gebe sie wieder aus.
https://msdn.microsoft.com/de-de/library/fs0z9zxd(v=vs.110).aspx

Gruß grexit