GC Недостаточно памяти в Drools Rule Engine в проекте Spring Boot - PullRequest
0 голосов
/ 27 апреля 2018

Мне нужно сравнить данные двух List с на основе двух полей и, если данные совпадают, добавить их в другой список.

Правило, которое я написал, работает нормально, но когда я пытаюсь проверить его на большее количество записей (скажем, 10000 записей), оно выдает 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));

Оба этих списка имеют одинаковые поля. Теперь мне нужно проверить, совпадают ли данные полей field1 и field2 list1 с данными 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.

1 Ответ

0 голосов
/ 27 апреля 2018

Drools основан на арифметике Rete, поэтому для выполнения работы CROSS-JOIN потребуется O (m * n) времени и памяти, что легко приводит к плохой производительности и OOM. Старайтесь не записывать условие объединения в правилах, выполняйте объединение вне рабочей памяти.

...