我需要根据两个字段比较两个List
的数据,如果数据匹配,则将其添加到另一个列表中。
我写的规则工作正常但是当我试图测试它以获得更多记录(比如10,000条记录)时,它正在抛出GC Out of Memory error
。
为此,我在工作记忆中添加了两个列表(事实)。添加它的代码如下:
// insert List 1
list1.stream().forEach(p -> kieSession.insert(p));
// insert List 2
list2.stream().forEach(p ->kieSession.insert(p));
这两个列表都有相同的字段。现在,我需要检查list1的field1和field2的数据是否与list2的数据匹配。我写的规则的代码如下:
rule "To check list1 and list2"
salience 5
no-loop true
when
list1: List1($field1:field1,$field2:field2)
list2: List2($field1List2:field1,$field2List2:field2)
eval($field1List2==$field1&&$field2List2==$field2)
then
globalList.add(list2);
retract(list1);
retract(list2);
end
我无法找出GC out of memory
的原因。
我是否对规则做错了或者我需要增加JVM内存?
目前,JVM内存为-Xms2048m
。
答案 0 :(得分:1)
Drools基于Rete算法,因此需要O(m * n)时间和内存来执行CROSS-JOIN工作,这会导致性能不佳和OOM容易。尽量不要在规则中编写连接条件,在工作内存外部进行连接工作。