2009-07-25 23 views
0

我目前正在使用Drools 5.0编写应用程序。这个应用程序似乎运行速度有点慢,但我有一个理论为什么。此应用程序接收许多已存储在知识会话中的事实更新。引擎盖下的Drools更新功能确实可以缩回,然后插入。这个应用程序有200多条规则。当某些事实被移除时,一些规则被写入火中。当某些事实被置入知识会话中时,其他规则被写入火中。由于更新确实会收回,那么在更新过程中,插入是否会导致收回和插入相关的规则?即使知识会议中没有真正被“插入”或撤回的东西?Drools更新方法可能会导致我的问题

有一点需要注意,我将WorkingMemoryFileLogger吸引到了我的知识会议中,以更好地了解发生了什么。那是当我看到很多意外的撤回/插入规则激活创建被添加到议程中,但似乎他们不会被激活。在我看来,更新事实可能是昂贵的,尤其是基于您的事实模型,我应该谨慎使用。它是否正确?

回答

0

我认为你已经正确地理解了它。更新有点像收缩和断言。 首先要确定的是,如果你的规则给你你想要的东西 - 即做到这一点,但你只是想提高性能?

在某些方面,您可以将更新(也可以检查“修改”关键字..)作为不可变性邪恶的一部分;)当您更新时 - 您告诉网络事实已发生变化,但它还没有在现场级别(即TBD)跟踪它,所以它可能会导致更多的工作,然后是必要的,因为所有这些激活都是不需要的(因为它们使用的值实际上并未改变) 。难以更具体 - 如果您提供了一些样本规则/事实模型(如果您当然可以以安全的方式!),我们可能会提出一些想法来将其细分为更细粒度。

祝你好运!

+0

感谢Micheal的回应。你已经证实了我的怀疑。就准确性而言,引擎似乎工作正常,但我的答案是潜在的,因为处理所有规则/事实花费的时间太长。 我对如何重构事实模型有一些想法,但是想验证我正在关注正确的问题,因为我的重构工作可能需要一段时间。 再次感谢! – loyalBrown 2009-07-27 01:40:30

0

要知道的最好方法是配置应用程序,并找出发生了什么。将OptimizeIt或JProbe与JDK 1.6附带的jvisualvm.exe结合使用。不要猜测 - 获取更多数据。

+0

我已经介绍了我的应用程序。我的大部分时间都是在作为Drools界面一部分的fireAllRules调用中消耗的。该调用如何执行取决于我的规则设计和事实模型。我希望有人对Drools的ReteOO实现比我更深入的理解,可以提供一些有关事实更新而不是断言时发生的事情的洞察。另外,告诉我这可能会如何影响fireAllRules调用。 – loyalBrown 2009-07-26 00:58:01

0

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

相关问题