我有一条规则,检查是否有5个具有相同值的事实(5个事实在过去7天内具有相同的值)。现在我正在处理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内存问题或如何优化此规则?
提前感谢
UPDATE ::
我正在使用此查询进行测试:
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堆问题。
我不明白。这是我的问题的正确查询???
答案 0 :(得分:3)
您正在引发组合爆炸:40个事实将与您的五个子句的所有可能组合相匹配。一个好的方法是计算符合您标准的事实数量。这是通过将规则用作查询(在其他地方描述in this forum thread)来实现的。