Я написал код Java, который использует механизм правил drools. Когда я пытался проверить производительность кода, добавляя все больше и больше правил в файл правил (.drl). Программа перестала работать, когда я упаковал 100000 правил в файл правил размером 14 МБ.
Мой файл правил выглядит так (макет правил):
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) в один файл правил?