我正在使用一些Xquery代码(使用SAXON)对大型XML文件执行一个简单的XQuery文件。
XML文件(位于this.referenceDataPath上)具有300万个“行”节点,其格式为:
<row>
<ISRC_NUMBER>1234567890</ISRC_NUMBER>
</row>
<row>
<ISRC_NUMBER>1234567891</ISRC_NUMBER>
</row>
<row>
<ISRC_NUMBER>1234567892</ISRC_NUMBER>
</row>
等等...
XQuery文档(位于this.xqueryPath)为:
declare variable $isrc as xs:string external;
declare variable $refDocument external;
let $isrcNode:=$refDocument//row[ISRC_NUMBER=$isrc]
return count($isrcNode)
Java代码是:
private XQItem referenceDataItem;
private XQPreparedExpression xPrepExec;
private XQConnection conn;
//set connection string and xquery file
this.conn = new SaxonXQDataSource().getConnection();
InputStream queryFromFile = new FileInputStream(this.xqueryPath);
//Set the prepared expression
InputStream is = new FileInputStream(this.referenceDataPath);
this.referenceDataItem = conn.createItemFromDocument(is, null, null);
this.xPrepExec = conn.prepareExpression(queryFromFile);
xPrepExec.bindItem(new QName("refDocument"), this.referenceDataItem);
//the code below is in a seperate method and called multiple times
public int getCount(String searchVal){
xPrepExec.bindString(new QName("isrc"), searchVal, conn.createAtomicType (XQItemType.XQBASETYPE_STRING));
XQSequence resultsFromFile = xPrepExec.executeQuery();
int count = Integer.parseInt(resultsFromFile.getSequenceAsString(new Properties()));
return count;
}
连续多次调用getCount方法(例如1000000次)以验证XML文件中是否存在许多值。
每次调用getCount时,Xquery查询的当前速度约为500毫秒,考虑到XML文档在内存中并且该查询是已准备好的查询,这似乎非常慢。
我使用XQuery的原因是作为将来工作的概念证明,其中XML文件将具有更复杂的布局。
我在具有8GB RAM的i7上运行代码,因此内存不是问题-我还增加了为程序分配的堆大小。
关于如何提高此代码速度的任何建议?
谢谢!
最佳答案
对于如何提高速度的问题,最明显的答案是尝试使用Saxon-EE,它具有更强大的优化器,并且还使用字节码生成。我没有尝试过,但是我认为Saxon-EE将检测到该查询将从建立索引中受益,并且每次出现该查询时都将重复使用相同的索引。
我要提出的另一个建议是声明变量$ refDocument的类型-类型信息有助于优化程序做出更明智的决定。例如,如果优化器知道$ refDocument是单个节点,则它知道$ refDocument // X将自动按文档顺序排列,而不需要排序操作。
用“ eq”替换“ =”运算符也值得尝试。
关于java - XQuery Java Performance with Large XML文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10907387/