Drools更新方法可能会导致我的问题

时间:2009-07-25 22:01:20

标签: java drools

我目前正在使用Drools 5.0编写应用程序。这个应用程序似乎运行有点慢,但我有一个理论原因。此应用程序接收许多已存储在知识会话中的事实的更新。引擎盖下的Drools更新功能实际上是一个缩进然后插入。此应用程序有200多条规则。当某些事实被删除时,有些规则会被写入。当某些事实被声明到知识会话中时,其他规则被写入。由于更新确实进行了撤销,然后插入将在更新期间撤消与插入相关的规则吗?即使没有任何内容真正被“插入”或从知识会话中收回?

有一点需要注意,我将WorkingMemoryFileLogger连接到我的知识会话上,以便更好地了解最新情况。就在那时我看到很多意想不到的收回/插入规则 - 激活创作被添加到议程中,但似乎它们永远不会被激活。在我看来,更新事实可能是昂贵的,特别是基于你的事实模型,我应该谨慎使用。这是对的吗?

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

在某些方面,你可以考虑更新(并检查“modify”关键字..)作为不可变性的邪恶的一部分;)当你更新 - 你告诉网络事实已经改变,但它没有还没有在现场级别(即TBD)跟踪它,因此可能会导致更多的工作,因为所有这些激活都是非真正需要的(因为它们使用的是实际没有变化的字段)。

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

祝你好运!

答案 2 :(得分:0)

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