我正在使用一些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/

10-12 12:33