Слюни - Создание KnowlegeBuilder быстрее?
У меня есть случай, когда мне нужно создать правило динамически только для однократного использования. Правила являются динамическими и в худшем случае могут быть разными для каждой итерации / запроса. Следовательно, я не могу их хранить.
Мое текущее понимание Drools заключается в том, что вам нужно создать KnowledgeBuilder, а затем добавить правила.
Я создаю базу знаний следующим образом.
private KnowledgeBase readKnowledgeBase() throws Exception {
long t1 = System.currentTimeMillis();
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
long t11 = System.currentTimeMillis();
kbuilder.add( org.drools.io.ResourceFactory.newByteArrayResource(getRule()), ResourceType.DRL);
long t2 = System.currentTimeMillis();
KnowledgeBuilderErrors errors = kbuilder.getErrors();
if (errors.size() > 0) {
for (KnowledgeBuilderError error: errors) {
System.err.println(error);
}
throw new IllegalArgumentException("Could not parse knowledge.");
}
long t3 = System.currentTimeMillis();
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
long t4 = System.currentTimeMillis();
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
long t5 = System.currentTimeMillis();
Collection<KnowledgePackage> kpackages = kbase.getKnowledgePackages();
for (KnowledgePackage knowledgePackage : kpackages) {
System.out.println("Package -------- " + knowledgePackage.getName());
Collection<Rule> rules = knowledgePackage.getRules();
for (Rule rule : rules) {
System.out.println("****" + rule.getName());
}
}
long t6 = System.currentTimeMillis();
System.out.println( (t11-t1) + " " + (t2-t11) + " " + ( t3-t2) + " " + ( t4-t3) + " " + ( t5-t4) + " " + ( t6-t5)+ " " );
return kbase;
}
Основываясь на журналах времени, код занимает большинство (более 80%) времени только в этих двух операциях. Есть ли способ сделать это быстрее? ИЛИ есть ли способ достичь моего варианта использования?
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add( org.drools.io.ResourceFactory.newByteArrayResource(getRule()), ResourceType.DRL);
1 ответ
Следующий вызов фактически скомпилирует ваш код, то есть вызовет JDT-компилятор Java:
kbuilder.add (org.drools.io.ResourceFactory.newByteArrayResource (getRule ()), ResourceType.DRL);
Невозможно избежать этого, если вы не используете внутренние API, которые на самом деле очень сложны в использовании.
Существует промежуточный шаг, который заключается в создании канонической модели с использованием API-интерфейса конструктора дескрипторов. Это сэкономит вам несколько циклов, но не намного, поскольку самой тяжелой операцией является компиляция Java. Примеры использования API Descr Builder: