我目前在我们的.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