java - drools rule engine runs out of memory on a small rule file -
i wrote java code uses drools rule engine. when trying test performance of code adding more , more rules rule file(.drl). program stopped working when packed 100000 rules in 14mb rule file.
my rule file looks (mock-up rules):
package drools.rules import drools.dicomimage rule "phi rule0" when $di : dicomimage(boolname == true) system.out.println("rule 0 applied"); end rule "phi rule1" when $di : dicomimage(boolname == true) system.out.println("rule 1 applied"); end rule "phi rule2" when $di : dicomimage(boolname == true) system.out.println("rule 2 applied"); end here piece of code applies rules:
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(); it exited @ line doing addpackagefromdrl following error:
exception in thread "main" java.lang.outofmemoryerror: java heap space @ java.lang.throwable.printstacktrace(unknown source) @ org.eclipse.jdt.internal.compiler.util.util.getexceptionsummary(util.java:627) @ org.eclipse.jdt.internal.compiler.compiler.handleinternalexception(compiler.java:587) @ org.eclipse.jdt.internal.compiler.compiler.compile(compiler.java:522) @ org.drools.compiler.commons.jci.compilers.eclipsejavacompiler.compile(eclipsejavacompiler.java:405) @ org.drools.compiler.commons.jci.compilers.abstractjavacompiler.compile(abstractjavacompiler.java:49) @ org.drools.compiler.rule.builder.dialect.java.javadialect.compileall(javadialect.java:405) @ org.drools.compiler.compiler.dialectcompiletimeregistry.compileall(dialectcompiletimeregistry.java:46) @ org.drools.compiler.compiler.packageregistry.compileall(packageregistry.java:107) @ org.drools.compiler.compiler.packagebuilder.compileall(packagebuilder.java:1317) @ org.drools.compiler.compiler.packagebuilder.compileallrules(packagebuilder.java:968) @ org.drools.compiler.compiler.packagebuilder.addpackage(packagebuilder.java:956) @ org.drools.compiler.compiler.packagebuilder.addpackagefromdrl(packagebuilder.java:452) @ org.drools.compiler.compiler.packagebuilder.addpackagefromdrl(packagebuilder.java:428) @ drools.applydicomrules.initializedrools(applydicomrules.java:65) @ drools.applydicomrules.main(applydicomrules.java:26) does not work if run -xms1024m. don't think going need memory anyway. , applying rules single fact (object).
what taking ram? not supposed put many rules (100000) in 1 rule file?
well, wouldn't call file containing 100000 rules "small", which, according favourite dictionary, means "few in number or little in amount", , 100000 isn't "a few". if experiment has serious background should reconsider approach - likely, on wrong track.
that, said, isn't drools rule engine either runs out of memory: java compiler can't handle amount of source code in single java file.
- using several drl files should circumvent oom problem.
- also, trying 6.x version might since code generation , compilation has changed between 5.x , 6.x.
- however, quite meaningful set of rules comprising 100000 going cause problems when reach execution stage.
Comments
Post a Comment