java - 大型 XML 文件的 XQuery Java 性能

标签 java xquery saxon

我正在编写一些 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 文件中是否存在多个值。

当前 Xquery 查询的速度约为每次调用 getCount 500 毫秒,考虑到 XML 文档位于内存中并且查询是准备好的查询,这似乎非常慢。

我使用 XQuery 的原因是作为 future 工作的概念证明,其中 XML 文件将具有更复杂的布局。

我在具有 8GB RAM 的 i7 上运行代码,因此内存不是问题 - 我还增加了程序分配的堆大小。

关于如何提高此代码的速度有什么建议吗?

谢谢!

最佳答案

对于如何提高速度的问题,最明显的答案是尝试 Saxon-EE,它具有更强大的优化器,并且还使用字节码生成。我还没有尝试过,但我认为 Saxon-EE 会检测到该查询将从构建索引中受益,并且每次出现查询时都会重复使用相同的索引。

我提出的另一个建议是声明变量 $refDocument 的类型 - 类型信息有助于优化器做出更明智的决策。例如,如果优化器知道 $refDocument 是单个节点,那么它就知道 $refDocument//X 将自动按文档顺序排列,而不需要任何排序操作。

用“eq”替换“=”运算符也值得尝试。

关于java - 大型 XML 文件的 XQuery Java 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10907387/

相关文章:

java - spring boot 找不到实体

java - Netbeans 中的 jsplitpane

java - 使用TransformerFactory从家庭版到企业版

java - Saxon XQuery编译器的优化

parameters - 使用 saxon 将参数传递给样式表

java - 如何避免匿名类中出现大量代码?

java - Android中从本地隐藏文件夹下载图像并显示

xquery - 为什么第一个 xquery 语句有效但第二个不行

xquery - MarkLogic XQuery - 如果我有文档的 URI,如何返回该文档?

xml - 在具有命名空间的函数中查询 XML 数据