我目前在我們的.NET應用程序中使用Saxon來處理Xquery。我們正在處理非常大的XML文件(〜2GB)。當對直接使用Saxon二進制文件,這些文件中的一個運行中的XQuery,它需要完成評估時間約爲2分鐘,但是從我的C#應用程序在做評估時所經過的時間增加至10分鐘左右,而我的天堂還沒有能夠確定我做錯了什麼。如何提高C#中撒克遜評估的速度?
這是當我通過命令行運行使用Saxon二進制文件 XQuery的我在做什麼:
Query.exe -config:config.xml -q:XQueryTest.txt
這些都是3210的內容:
<configuration xmlns="http://saxon.sf.net/ns/configuration" edition="HE">
<xquery defaultElementNamespace="http://www.irs.gov/efile"/>
</configuration>
而且XQueryTest.txt
包含我們要處理的Xquery。當從命令行運行Xquery時,我們使用doc()
函數對其進行修改以指示我們將運行它的文件。下面是一個示例行:
for
$ReturnData at $currentReturnDataPos in if(exists(doc("2GB.XML")/Return/ReturnData)) then doc("2GB.XML")/Return/ReturnData else element{'ReturnData'} {''}
如上所述,運行此命令需要大約2分鐘才能完成。
現在這是我在我的.NET應用程序,使這個同樣的評價正在做。
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();
}
我們有的問題是在這一行:evaluator.ContextItem = documentBuilder.Build(myReader)
。這甚至不是評估,而只是文件的加載。這條線需要太多的時間來執行,我需要知道這是否是預期的,或者是否有辦法提高速度。我已經使用了Build()
方法的所有不同重載,並且它們都需要花費很多時間來完成,比從命令行執行時執行所花費的時間多2分鐘。
關於使用Saxon的流媒體容量按部分讀取文件,由於我們生成的Xqueries,這不是一個選項,因爲Xquery可以在XML的任何部分組合信息。
http://stackoverflow.com/questions/2415434/the-limitation-on-the-size-of-net-array顯示.NET中任何分配對象的最大大小爲2GB。也許撒克遜正在遇到一個.NET內存問題,不得不採取額外的步驟,二進制可能不必採取?也許看看使用的資源會顯示二進制文件能夠使用額外的內存?對不起,我沒有別的東西或撒克遜的特殊經歷。乾杯! – chryosolo