Я написал код Java, который использует механизм управления слюнами. Когда я пытался проверить производительность кода, добавив все больше правил в файл правила (.drl). Программа перестала работать, когда я упаковал 100000 правил в файле правил 14 МБ.двигатель drools rule исчерпал память в файле небольшого правила
Мой файл правило выглядит следующим образом (правила макетных):
package drools.rules
import drools.DicomImage
rule "PHI rule0"
when
$di : DicomImage(boolName == true)
then
System.out.println("rule 0 is applied");
end
rule "PHI rule1"
when
$di : DicomImage(boolName == true)
then
System.out.println("rule 1 is applied");
end
rule "PHI rule2"
when
$di : DicomImage(boolName == true)
then
System.out.println("rule 2 is applied");
end
Вот кусок кода, который применяет правила:
String filename = "rule100000.drl";
Reader reader = new InputStreamReader(ApplyDicomRules.class.getResourceAsStream(filename));
PackageBuilder pBuilder = new PackageBuilder();
pbuilder.addPackageFromDrl(reader);
Rulebase rbase = RuleBaseFactory.newRuleBase();
rbase.addPackage(pbuilder.getPackage());
runRules();
Он вышел на линии делать addPackageFromDrl с следующая ошибка:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.lang.Throwable.printStackTrace(Unknown Source)
at org.eclipse.jdt.internal.compiler.util.Util.getExceptionSummary(Util.java:627)
at org.eclipse.jdt.internal.compiler.Compiler.handleInternalException(Compiler.java:587)
at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:522)
at org.drools.compiler.commons.jci.compilers.EclipseJavaCompiler.compile(EclipseJavaCompiler.java:405)
at org.drools.compiler.commons.jci.compilers.AbstractJavaCompiler.compile(AbstractJavaCompiler.java:49)
at org.drools.compiler.rule.builder.dialect.java.JavaDialect.compileAll(JavaDialect.java:405)
at org.drools.compiler.compiler.DialectCompiletimeRegistry.compileAll(DialectCompiletimeRegistry.java:46)
at org.drools.compiler.compiler.PackageRegistry.compileAll(PackageRegistry.java:107)
at org.drools.compiler.compiler.PackageBuilder.compileAll(PackageBuilder.java:1317)
at org.drools.compiler.compiler.PackageBuilder.compileAllRules(PackageBuilder.java:968)
at org.drools.compiler.compiler.PackageBuilder.addPackage(PackageBuilder.java:956)
at org.drools.compiler.compiler.PackageBuilder.addPackageFromDrl(PackageBuilder.java:452)
at org.drools.compiler.compiler.PackageBuilder.addPackageFromDrl(PackageBuilder.java:428)
at drools.ApplyDicomRules.initializeDrools(ApplyDicomRules.java:65)
at drools.ApplyDicomRules.main(ApplyDicomRules.java:26)
Не работает, даже если я запустил его с -Xms1024m. В любом случае, я не думаю, что это потребует столько памяти. И я применял правила только к одному факту (объекту).
Что такое так много барана? Разве я не должен вставлять столько правил (100000) в один файл правил?
Для ситуации с таким количеством правил лучше ли создавать один файл drl для каждого правила? Я не понимаю, как это будет иметь меньший объем памяти при загрузке того же количества правил. – Nasreddin
Один файл за правило попадает в другую крайность. 100000 файлов вряд ли удобно. - меньший объем памяти ** во время компиляции ** получается из меньшего количества кода. Что касается исполнения, это может быть другой проблемой, но вы еще не зарегистрированы. – laune
Если я разбиваю его на несколько drl-файлов, мне нужно только вызвать 'rbase.addPackage (pbuilder.getPackage()); 'один раз, когда я запускаю' pbuild. addPackageFromDrl (drlfile) 'несколько раз, правильно? – Nasreddin