将事实插入工作记忆的时间根据规则库大小增加
Time to insert facts in the working memory increase based on the rule base size
我在我的系统中进行了一些评估实验,检查插入不同(规则数量)规则库所花费的时间和内存中的事实数量。注意:我没有使用持久性。流口水版本:6.3.0.Final.
Table - 规则库 (RB)、插入时间 (TTI)、以毫秒为单位的时间。
基于上面预设的table,我想知道为什么随着规则库大小的增加,将事实包含在内存中的时间增加?
我不是 Drools 专家。
在给定的网络状态下,事实的插入、收回和更新会导致条件的即时评估。这不仅仅是 条 条规则;重要的是事实类型的引用数量。
您观察到的增加小于 O(N),N 是规则的数量,这与理论非常吻合。
12,000 条规则的数量非常多(除非您发明规则只是为了测试可扩展性)。如果它们是真实的,并且您担心性能,则应该修改规则结构。
编辑 由于 OP 的评论。
"number of references of a fact's type" 是特定 class(= 类型)在模式中出现的次数。在你的例子中
rule x when
$spec1 : Specification ( )
$spec2 : Specification ( $spec1.id ==2, id == 3, value > $spec1.value )
rule "x+1" when
$spec1 : Specification ( )
$spec2 : Specification ( $spec1.id ==3, id == 4, value > $spec1.value )
您有 2 个规则,但有 4 个对 Specification
的引用。这势必会在 Engine 中创建一个更复杂的网络。此外,排他性 依赖于 first 模式 ($spec1.id ==X
) 中的数据但出现在 second 模式几乎可以肯定是反模式。
使用像这样的糟糕结构,几乎可以无限地降低 RBS 的速度,而不仅仅是 Drools。显然你确实只是在测试可伸缩性。坚持写得很好的规则可能会给您带来更多决定性的结果。
我在我的系统中进行了一些评估实验,检查插入不同(规则数量)规则库所花费的时间和内存中的事实数量。注意:我没有使用持久性。流口水版本:6.3.0.Final.
Table - 规则库 (RB)、插入时间 (TTI)、以毫秒为单位的时间。
基于上面预设的table,我想知道为什么随着规则库大小的增加,将事实包含在内存中的时间增加?
我不是 Drools 专家。
在给定的网络状态下,事实的插入、收回和更新会导致条件的即时评估。这不仅仅是 条 条规则;重要的是事实类型的引用数量。
您观察到的增加小于 O(N),N 是规则的数量,这与理论非常吻合。
12,000 条规则的数量非常多(除非您发明规则只是为了测试可扩展性)。如果它们是真实的,并且您担心性能,则应该修改规则结构。
编辑 由于 OP 的评论。
"number of references of a fact's type" 是特定 class(= 类型)在模式中出现的次数。在你的例子中
rule x when
$spec1 : Specification ( )
$spec2 : Specification ( $spec1.id ==2, id == 3, value > $spec1.value )
rule "x+1" when
$spec1 : Specification ( )
$spec2 : Specification ( $spec1.id ==3, id == 4, value > $spec1.value )
您有 2 个规则,但有 4 个对 Specification
的引用。这势必会在 Engine 中创建一个更复杂的网络。此外,排他性 依赖于 first 模式 ($spec1.id ==X
) 中的数据但出现在 second 模式几乎可以肯定是反模式。
使用像这样的糟糕结构,几乎可以无限地降低 RBS 的速度,而不仅仅是 Drools。显然你确实只是在测试可伸缩性。坚持写得很好的规则可能会给您带来更多决定性的结果。