Rendimiento Java XQuery con archivo XML grande

Estoy trabajando en un código Xquery (usando SAXON) para ejecutar un archivo XQuery simple en un archivo XML grande.

El archivo XML (ubicado en this.referenceDataPath) tiene 3 millones de nodos de "fila" y tiene la forma:

<row>
<ISRC_NUMBER>1234567890</ISRC_NUMBER>
</row>
<row>
<ISRC_NUMBER>1234567891</ISRC_NUMBER>
</row>
<row>
<ISRC_NUMBER>1234567892</ISRC_NUMBER>
</row>

etc ...

El documento XQuery (ubicado en this.xqueryPath) es:

declare variable $isrc as xs:string external;
declare variable $refDocument external;
let $isrcNode:=$refDocument//row[ISRC_NUMBER=$isrc]
return count($isrcNode)

El código de Java es:

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;

}

El método getCount se llama muchas veces seguidas (por ejemplo, 1000000 veces) para validar la existencia de muchos valores en el archivo XML.

La velocidad actual de la consulta Xquery es de aproximadamente 500 milisegundos por cada llamada a getCount, lo que parece muy lento teniendo en cuenta que el documento XML está en la memoria y la consulta está preparada.

La razón por la que estoy usando XQuery es como una prueba de concepto para trabajos futuros donde el archivo XML tendrá un diseño más complejo.

Estoy ejecutando el código en un i7 con 8 GB de RAM, por lo que la memoria no es un problema: también aumenté el tamaño de almacenamiento dinámico asignado para el programa.

¿Alguna sugerencia sobre cómo puedo mejorar la velocidad de este código?

¡Gracias!

Respuesta 1

La respuesta más obvia a la pregunta de cómo mejorar la velocidad es probar Saxon-EE, que tiene un optimizador más potente y también utiliza la generación de bytecode. No lo he intentado, pero creo que Saxon-EE detectará que esta consulta se beneficiará de la creación de un índice, y el mismo índice se usará repetidamente para cada aparición de la consulta.

La otra sugerencia que haría es declarar el tipo de variable $ refDocument: la información de tipo ayuda al optimizador a tomar decisiones más informadas. Por ejemplo, si el optimizador sabe que $ refDocument es un solo nodo, entonces sabe que $ refDocument // X estará automáticamente en orden de documentos, sin necesidad de una operación de clasificación.

Reemplazar el operador "=" por "eq" también vale la pena intentarlo.

Respuesta: 2

Tengo un programa Java que se ejecuta automáticamente todas las mañanas y contiene varios métodos que son independientes entre sí. A veces tengo que hacer pruebas, así que comentaré todos los ...

Encontré un problema cuando intentaba importar un archivo csv a mi código java, aquí está el código java relacionado try {File file = new File ("/ home / hanrui / workspace / table.csv"); BufferedReader ...

El enunciado del problema es: en este caso, la inclusión es nula y la exclusión tiene algunos valores, por lo que debo verificar si temp está excluido, si temp está excluido, entonces no haga nada o usted ...

A veces me gustaría pasar un objeto inmutable a un método y cambiar su valor dentro del método o me gustaría asignar otro objeto a la referencia del parámetro (ejemplo 1). O lo haría ...