0

我目前正在使用 Drools 5.0 编写应用程序。这个应用程序似乎运行有点慢,但我有一个理论原因。此应用程序接收许多已存储在知识会话中的事实更新。引擎盖下的 Drools 更新功能确实先回缩然后再插入。此应用程序有超过 200 条规则。当某些事实被删除时,一些规则被写入触发。当某些事实被断言到知识会话中时,其他规则被写入触发。由于更新确实会撤回,那么插入是否会在更新期间触发撤回和插入相关规则?即使没有真正“插入”或从知识会话中撤回?

需要注意的一件事是,我将 WorkingMemoryFileLogger 与我的知识会话“挂钩”,以便更好地了解正在发生的事情。那时我看到许多意想不到的撤回/插入规则激活创建被添加到议程中,但似乎它们从未被激活。在我看来,更新事实可能很昂贵,尤其是根据您的事实模型,我应该谨慎使用。它是否正确?

4

3 回答 3

0

最好的了解方法是分析应用程序并准确了解正在发生的事情。将 OptimizeIt 或 JProbe 与 JDK 1.6 附带的 jvisualvm.exe 结合使用。不要猜测 - 获取更多数据。

于 2009-07-26T00:33:43.670 回答
0

我想你已经正确理解了。更新有点像撤回加断言。首先要确定的是你的规则是否给了你想要的东西——即它是否有效但你只是想提高性能?

在某些方面,您可以将更新(以及检查“修改”关键字..)视为不变性弊端的一部分;)当您更新时 - 您告诉网络事实已经改变,但还没有在字段级别(即待定)跟踪它,因此它可能会导致更多工作,然后是必要的,因为创建了所有这些并不真正需要的激活(因为它们使用的字段实际上并没有改变值)。

很难更具体 - 如果您提供了一些示例规则/事实模型(如果您可以以安全的方式当然!)我们可能会提出一些想法来将其分解为更细化。

祝你好运 !

于 2009-07-26T23:23:31.637 回答
0

根据我的经验,只有当您需要在当前执行规则的上下文中通过 WHERE 子句重新评估实体时,才需要 update() 方法。由于 RETE 评估在规则输入时立即发生,删除一些 update() 语句(在可能的情况下)将加快它的执行速度。有时这涉及设置一些标志并将真正的 update() 推迟到以后的规则。您还可以将当前实体状态的一些评估放入 THEN 子句中的 if 语句中,使用 WHERE 子句进行更基本的过滤。

于 2009-10-24T18:16:28.377 回答