大きな XML ファイルに対して単純な XQuery ファイルを実行するために、いくつかの Xquery コード (SAXON を使用) に取り組んでいます。
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 は、XML ファイル内の多くの値の存在を検証するために、連続して何度も呼び出されます (たとえば、1000000 回)。
Xquery クエリの現在の速度は、getCount の呼び出しごとに約 500 ミリ秒です。これは、XML ドキュメントがメモリ内にあり、クエリが準備されたものであることを考えると、非常に遅いようです。
私が XQuery を使用している理由は、XML ファイルがより複雑なレイアウトを持つ将来の作業の概念実証としてです。
8GB RAM を搭載した i7 でコードを実行しているため、メモリは問題になりません。また、プログラムに割り当てられたヒープ サイズも増やしました。
このコードの速度を改善する方法について何か提案はありますか?
ありがとう!