Reducción del consumo de memoria

Para reducir el consumo de memoria del motor de reglas en modalidad secuencial, puede utilizar las palabras clave select y dynamicselect , la palabra clave dynamicselect seguida de un dominio de reglas o eliminar metadatos de regla.

La memoria consumida cuando un motor de reglas utiliza el proceso secuencial se puede reducir significativamente si los objetos ejecutables creados para realizar la parte de condición y la parte de acción se descartan.

Uso de palabras clave select y dynamicselect

Utilizando las palabras clave select y dynamicselect , puede seleccionar las reglas que pertenecen a una tarea de regla. Estas palabras clave operan en objetos IlrRule y devuelven un valor booleano para indicar si se ha seleccionado una regla. Por ejemplo:

body = select(?rule) {
               if (?rule.getName().startsWith("R1.") return true;
               else return false;
           }

Desde las palabras clave select y dynamicselect , el motor de reglas itera en las reglas del conjunto de reglas y llama al selector para cada una de ellas. Cuando el número total de reglas es alto y el número seleccionado de reglas es bajo, es probable que el bucle consuma mucha memoria. Para superar este costoso uso de memoria, puede escribir las funciones select y dynamicselect sin argumentos. Cuando las funciones no toman argumentos, el cuerpo del selector itera en las reglas y devuelve una matriz de objetos IlrRule . Por ejemplo:

body = select() {
              IlrRule[] rules = getRuleset().getAllRules();
              // do some selection...
              return rules;
           }

Mediante el uso de las palabras clave select y dynamicselect , junto con un mecanismo de indexación para encontrar las reglas de forma eficaz, puede eliminar bucles largos que consumen memoria costosa.

Uso de dynamicselect seguido de un dominio de reglas

Una palabra clave dynamicselect puede ir seguida de un dominio, iniciado por la palabra clave in (consulte en en la Referencia de IRL para obtener la referencia completa de la palabra clave in ). A continuación se muestra un ejemplo de cómo utilizar dynamicselect con la palabra clave in :

body = dynamicselect(?rule) {
               if (?rule.getName().startsWith("R1.") return true;
               else return false;
           } in EXPRESSION;

Aquí, in EXPRESSION es opcional. El elemento EXPRESSION debe tener el tipo IlrRule[] y generalmente es una llamada de método. Las reglas de EXPRESSION se compilan una vez. La propia sentencia dynamicselect selecciona las reglas entre las reglas de EXPRESSION.

Cuando el selector se define con un argumento, en lugar de iterar en todo el conjunto de reglas para encontrar qué reglas componen el cuerpo de tarea de regla, sólo itera en las reglas del dominio. El dominio representa un superconjunto de las reglas que componen el cuerpo de la tarea de regla. Si la tarea de regla se define con la propiedad de algoritmo igual a sequential, el código de bytes Java™ sólo se genera para las reglas de este superconjunto. En cada cálculo del conjunto real de reglas del cuerpo de tarea de regla, es decir, en cada ejecución de la tarea de regla, el código de bytes significativo generado para el superconjunto se activa para esta ejecución.

El dominio de reglas proporciona dos ventajas:

  • El número de reglas sobre las que iterar está claramente definido.

  • El código de bytes sólo se genera una vez, a pesar de la propiedad dinámica del cuerpo.

Nota:

Puesto que EXPRESSION se calcula sólo una vez, no debe depender de parámetros específicos del motor de reglas. En otras palabras, EXPRESSION sólo debe depender de las propiedades de regla estáticas.

Eliminación de metadatos de regla

En el caso en el que se proporciona cada dynamicselect con un dominio, el código de bytes se puede preparar antes de crear un motor de reglas. Una vez que se ha creado un motor de reglas, los metadatos de regla del código de bytes preparado ya no son necesarios para la modalidad de ejecución secuencial y se pueden eliminar.

Para que se eliminen los metadatos de regla, puede utilizar estos métodos después de que se haya pasado el conjunto de reglas:

  • IlrRule#removeMetadata()

  • IlrRuleset.IlrRuleset#removeMetadata(boolean,%20boolean)

  • IlrRuleset.IlrRuleset#removeMetadata()