Вставки / оценки прогрессивно медленнее при использовании временного правила

У меня есть правило, которое ищет 2 последовательных события для одной и той же сущности. Чтобы провести стресс-тестирование, я вставил 10 тысяч последовательных событий. Я вызываю fireAllRules() после каждого события вставляется. Я распечатываю метки времени после каждых 100 событий. Я заметил, что вставки / оценки становятся все медленнее по мере добавления событий. Вот правило:

rule "Consecutive events"
when
    $latest : Event($id : id) // newest event
    not Event(id == $id, this after $latest) // no events after the newest
    $previous : Event(id == $id, this before $latest) // event before the newest
    not Event(id == $id, this before $latest, this after $previous) // no events between $latest and $previous
then
    //System.out.println($latest.toString());
end

Насколько я понимаю, вышеприведенное правило должно соответствовать только последним 2 событиям, а автоматическое управление памятью должно удалять более старые события. Если так, то почему вставки постепенно замедляются? Интересно, что ksession.getObjects() возвращает все вставленные события, а не только последние 2 события. Мое понимание правила неверно? Правило ли каким-то образом заставляет все события оставаться в памяти? Я использую v6.0.1.Final.

1 ответ

Решение

Ваше правило не определяет ограничение времени для автоматического отвода как before а также after не ограничены.

Есть несколько способов сохранить количество событий на низком уровне, поэтому вставки становятся все медленнее. Вот простая техника:

declare Pair
 one : Event
 two : Event
 id : String
end

rule "create Pair"
when
  $e: Event( $id: id )
  not Pair( id == id ) 
then
  insert( new Pair( null, $e, $id ) );
end

rule "another Pair"
when
  $e2: Event( $id: id )
  $p: Pair( $e0: one, $e1: two != $e2, id == $id )
then
  modify( $p ){
    setOne( $e1 ),
    setTwo( $e2 ) }
  retract( $e0 ); // optional
  // process pair $e1, $e2 
end
Другие вопросы по тегам