使用时间规则时,插入/评估会逐渐变慢

时间:2014-07-14 22:08:39

标签: drools drools-fusion

我有一条规则,为同一个实体查找2个连续事件。为了对它进行压力测试,我插入了10K连续事件。我在插入每个事件后调用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 个答案:

答案 0 :(得分:0)

您的规则未定义自动撤消的时间限制,因为beforeafter不受限制。

有几种方法可以保持事件数量较少,这就是插入速度逐渐变慢的原因。这是一个简单的技术:

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