我正在编写一些 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>
ETC...
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 文件中是否存在许多值。
Xquery 查询的当前速度对于每次调用 getCount 大约需要 500 毫秒,考虑到 XML 文档在内存中并且查询是准备好的,这似乎非常慢。
我使用 XQuery 的原因是作为未来工作的概念证明,其中 XML 文件将具有更复杂的布局。
我在具有 8GB RAM 的 i7 上运行代码,因此内存不是问题——我还增加了程序的分配堆大小。
关于如何提高此代码的速度的任何建议?
谢谢!