Ich habe eine sehr große XML-Datei im Maßstab von GBs zusammengeführt. Ich verwende folgenden Code mit Xpath-Abfragen zum Lesen und Verarbeiten von Daten.Abfragen sehr großer XML-Dateien
IColumn column = output.Schema.FirstOrDefault(col => col.Type != typeof(string));
if (column != null)
{
throw new ArgumentException(string.Format("Column '{0}' must be of type 'string', not '{1}'", column.Name, column.Type.Name));
}
XmlReaderSettings settings = new XmlReaderSettings();
settings.ConformanceLevel = ConformanceLevel.Auto;//.Fragment;
XmlReader r = XmlReader.Create(input.BaseStream, settings);
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(r);
//xmlDocument.LoadXml("<root/>");
//xmlDocument.DocumentElement.CreateNavigator().AppendChild(r);
//xmlDocument.Load(input.BaseStream);
XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmlDocument.NameTable);
if (this.namespaces != null)
{
foreach (Match nsdef in xmlns.Matches(this.namespaces))
{
string prefix = nsdef.Groups[1].Value;
string uri = nsdef.Groups[3].Value;
nsmgr.AddNamespace(prefix, uri);
}
}
foreach (XmlNode xmlNode in xmlDocument.DocumentElement.SelectNodes(this.rowPath, nsmgr))
{
foreach (IColumn col in output.Schema)
{
var explicitColumnMapping = this.columnPaths.FirstOrDefault(columnPath => columnPath.Value == col.Name);
XmlNode xml = xmlNode.SelectSingleNode(explicitColumnMapping.Key ?? col.Name, nsmgr);
output.Set(explicitColumnMapping.Value ?? col.Name, xml == null ? null : xml.InnerXml);
}
yield return output.AsReadOnly();
}
Allerdings funktioniert es nur gut für kleinere Dateien im MB-Maßstab. Es funktioniert lokal gut, aber nicht für ADLA. Ich muss auch den Namespace-Manager verwenden. Wie kann ich es skalieren, damit ich größere Dateien verarbeiten kann. Beim Übergeben eines Jobs mit einer großen Datei erhalte ich immer diesen Fehler ohne Information.
VertexFailedError
Diese Dateien werden in den RAM geladen - tun Sie genug haben? –
Es ist wahrscheinlich am besten, den XmlReader in diesem Fall selbst zu verwenden und das Ganze nicht in ein XmlDocument zu lesen. Es bietet schnellen, nur vorwärts gerichteten Lesezugriff. Sie können dann steuern, was Sie im Speicher haben und nicht das gesamte XML-Dokument. Es wird wahrscheinlich die Zugriffe, die Sie tun möchten, komplizierter machen, aber Sie haben zumindest eine gute Chance, sie zum Laufen zu bringen. – moreON
@GerardSexton, ich habe genug RAM, um sie lokal zu verarbeiten, aber ich bin nicht sicher über ADL. Die Datei ist etwa 2,7 GB und mein lokaler RAM ist 32 GB. Gibt es eine Möglichkeit für mich, den RAM etc. nach Jobs zu durchsuchen? (PS. Sehr neu zu u-sql und ADL) –