Ich verwende derzeit Saxon, um Xquery in unserer .NET-Anwendung zu verarbeiten. Wir arbeiten mit sehr großen XML-Dateien (~ 2 GB). Wenn die Xquery gegen eine dieser Dateien mit der Saxon-Binärdatei direkt ausgeführt wird, beträgt die Zeit für die Auswertung etwa 2 Minuten. Bei der Auswertung meiner C# -Anwendung erhöht sich die verstrichene Zeit jedoch auf etwa 10 Minuten Ich konnte noch nicht erkennen, was ich falsch mache.Wie kann man die Geschwindigkeit der sächsischen Auswertung in C# erhöhen?
Das ist, was ich tue, wenn ich den XQuery mit der Sächsischen Binärdatei über die Befehlszeile:
Query.exe -config:config.xml -q:XQueryTest.txt
Dies sind die Inhalte der config.xml
:
<configuration xmlns="http://saxon.sf.net/ns/configuration" edition="HE">
<xquery defaultElementNamespace="http://www.irs.gov/efile"/>
</configuration>
Und XQueryTest.txt
enthält die Xquery, die wir verarbeiten werden. Wenn Sie die Xquery über die Befehlszeile ausführen, ändern wir sie so, dass sie die Datei angibt, mit der wir sie ausführen werden, indem Sie die Funktion doc()
verwenden. Hier ist eine Beispielzeile:
for
$ReturnData at $currentReturnDataPos in if(exists(doc("2GB.XML")/Return/ReturnData)) then doc("2GB.XML")/Return/ReturnData else element{'ReturnData'} {''}
Wie oben erwähnt, dauert die Ausführung dieses Befehls ca. 2 Minuten.
Jetzt ist das, was ich in meiner .NET-Anwendung mache, um diese gleiche Bewertung zu machen.
Processor processor = new Processor();
DocumentBuilder documentBuilder = processor.NewDocumentBuilder();
documentBuilder.IsLineNumbering = true;
documentBuilder.WhitespacePolicy = WhitespacePolicy.PreserveAll;
XQueryCompiler compiler = processor.NewXQueryCompiler();
string query = BuildXqueryString();
if (!String.IsNullOrEmpty(query))
{
XQueryExecutable executable = compiler.Compile(query);
XQueryEvaluator evaluator = executable.Load();
using (XmlReader myReader = XmlReader.Create(@"C:\Users\Administrator\Desktop\2GB.xml"))
{
evaluator.ContextItem = documentBuilder.Build(myReader);
}
var evaluations = evaluator.Evaluate();
}
Das Problem, das wir haben, ist in dieser Zeile: evaluator.ContextItem = documentBuilder.Build(myReader)
. Was ist nicht einmal die Auswertung, sondern nur das Laden der Datei. Diese Zeile benötigt einfach zu viel Zeit, und ich muss wissen, ob das erwartet wird oder ob es eine Möglichkeit gibt, die Geschwindigkeit zu erhöhen. Ich habe alle verschiedenen Überladungen der Build()
Methode verwendet und sie nehmen alle viel Zeit in Anspruch, viel mehr als die 2 Minuten, die die Ausführung benötigt, wenn sie von der Befehlszeile ausgeführt wird.
In Bezug auf die Streaming-Kapazität von Saxon, um die Datei nach Teilen zu lesen, wegen der Xqueries, die wir generieren, ist das keine Option, da die Xquery Informationen in einem beliebigen Teil des XML kombinieren kann.
http://stackoverflow.com/questions/2415434/the-limitation-on-the-size-of-net-array zeigt, dass die maximale Größe eines zugewiesenen Objekts in .NET 2 GB ist. Vielleicht kommt Saxon in ein .NET-Speicherproblem und muss zusätzliche Schritte unternehmen, die die Binärdatei möglicherweise nicht ausführen muss? Vielleicht würde das Betrachten der verwendeten Ressourcen zeigen, dass die Binärdatei zusätzlichen Speicher verwenden kann? Tut mir leid, ich habe nichts anderes oder spezifische Erfahrung mit Saxon. Prost! – chryosolo