【问题标题】:Could the Drools update method potentially be causing my problemsDrools 更新方法可能会导致我的问题吗
【发布时间】:2009-07-25 22:01:20
【问题描述】:

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

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

【问题讨论】:

    标签: java drools


    【解决方案1】:

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

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

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

    祝你好运!

    【讨论】:

    • 感谢迈克尔的回复。你证实了我的猜想。就准确性而言,引擎似乎工作正常,但我的答案是潜在的,因为处理所有规则/事实需要很长时间。我对如何重构事实模型有一些想法,但想验证我是否专注于正确的问题,因为我的重构工作可能需要一段时间。再次感谢!
    【解决方案2】:

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

    【讨论】:

    • 我已经分析了我的应用程序。我的大部分时间都花在了作为 Drools 接口一部分的 fireAllRules 调用上。该调用的执行方式取决于我的规则设计和事实模型。我希望有人比我对 Drools 中的 ReteOO 实现有更深入的了解,可以提供一些关于当事实更新而不是断言时究竟会发生什么的见解。另外,告诉我这会如何影响 fireAllRules 调用。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-28
      • 2015-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多