java - Drools Java 内存不足错误

标签 java drools rule

我有一条规则,用于检查是否有 5 个事实具有相同的值(过去 7 天内有 5 个事实具有相同的值)。现在我正在处理 40 个事实,因此该规则会根据 40 个事实检查此问题。进入前20名没问题,但每次都需要更长的时间。 21 未执行,因为 Java 发送了 OutOfMemory 异常。

这是我的规则:

rule "MUL_04"
no-loop true
when

    r_A:Fact(viewed==false)
    r_B:Fact(viewed==true, INT_IP==r_A.INT_IP, Tools.check(SOL_FEC, r_A.SOL_FEC)<=7)
    r_C:Fact(viewed==true, INT_IP==r_A.INT_IP, Tools.check(SOL_FEC, r_A.SOL_FEC)<=7, r_B!=r_C)
    r_D:Fact(viewed==true, INT_IP==r_A.INT_IP, Tools.check(SOL_FEC, r_A.SOL_FEC)<=7, r_C!=r_D, r_B!=r_D)
    r_E:Fact(viewed==true, INT_IP==r_A.INT_IP, Tools.check(SOL_FEC, r_A.SOL_FEC)<=7, r_B!=r_E, r_C!=r_E, r_D!=r_E)
    r_F:Fact(viewed==true, INT_IP==r_A.INT_IP, Tools.check(SOL_FEC, r_A.SOL_FEC)<=7, r_B!=r_F, r_C!=r_F, r_D!=r_F, r_E!=r_F)


then
        modify (r_A) {
        setViewed(true),
        setEST_EST_FRA(1),
        setEST_PRO_EST(1)
    }
end

有人知道如何解决 Java 内存问题或如何优化此规则吗?

提前致谢

更新::

我正在使用此查询进行测试:

   query multipleRequests(Fact r_A, Integer exits)
    $exits := Number(intValue>=5) from accumulate(
         r_B:Fact(viewed==true,INT_IP == r_A.INT_IP,Tools.check(SOL_FEC, r_A.SOL_FEC) <=7),
         count(r_B)
         )
end

这条规则:

rule "MUL_04_WithQuery"
no-loop true
when
    r_A:Fact(viewed==false)
    $numbers : multipleRequests(r_A;)    
then
        modify (r_A) {
            setViewed(true),
            setEST_EST_FRA(1),
            setEST_PRO_EST(1)
        }
end

但我无法获得预期的性能。另外,当我尝试处理 100 多个事实时,我也遇到了 Java 堆问题。

我不明白。这是我的问题的正确查询吗???

最佳答案

您正在引发组合爆炸:40 个事实将以所有可能的组合与您的五个子句相匹配。一个好的方法是计算符合您的标准的事实数量。这是通过使用规则作为查询来完成的(在其他地方进行了描述, in this forum thread )。

关于java - Drools Java 内存不足错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19788566/

相关文章:

java - Win8 权限低导致安装失败

java - 碲中的 Portlet 支持

java - 我可以使用什么技术/方法在 J2EE 环境中热部署更改?

java - 有关 drools 运行时的信息

makefile - GNU make 在隐式规则中删除目标?

javascript - 如何运行(或构建然后运行?)这个 Mozilla Rhino 调试器?

java - 没有名为 persistenceUnit 的 EntityManager 持久性提供程序

regex - 流口水的正则表达式

java - 在特定时间或事实执行 ​​Drools 规则

c# - 模式或规则我不记得了