[rules-users] Rule performance with accumulate

Ryan Crumley crumley at gmail.com
Wed Jan 9 11:38:41 EST 2013


Thanks Geoffrey.

I have a few rules that have two accumulates. Upgrading to 5.5 shouldn't be
a problem so I will give that a try and see if it helps. Thanks for the tip!


On Wed, Jan 9, 2013 at 8:37 AM, Geoffrey De Smet <ge0ffrey.spam at gmail.com>wrote:

>  I 've also seen that accumulate and statefull don't always mix as good as
> they could.
> The new algorithm for 6.0 sounds promising to improve this (with "set
> based propagation").
>
> Do you have any rule that has 2 accumulates in 1 rule?
> That used to kill my statefull performance (3 times slower etc), but a
> recent experiment with 5.5 showed that that's no longer the case IIRC.
>
> Op 09-01-13 15:09, Ryan Crumley schreef:
>
>  Hi,
>
>  I am investigating performance of a Drools 5.4 stateful knowledge
> session. This session has about 200 rules, 200k facts and takes about 1
> hour to run to completion. Looking at the profile there is a hotspot that
> consumes almost 65% of the cpu time: java.util.AbstractList.hashCode().
>
>  Here is the full stack:
>
>
>  com.company.rules.engine.Rule_Set_weights_08b44ce519a74b58ab3f85735b2987cbDefaultConsequenceInvoker.evaluate(KnowledgeHelper,
> WorkingMemory)
>
>  com.company.rules.engine.Rule_Set_weights_08b44ce519a74b58ab3f85735b2987cbDefaultConsequenceInvokerGenerated.evaluate(KnowledgeHelper,
> WorkingMemory)
>
>  com.company.rules.engine.Rule_Set_weights_08b44ce519a74b58ab3f85735b2987cb.defaultConsequence(KnowledgeHelper,
> List, FactHandle, GradingFact, FactHandle, ReportNode, FactHandle,
> WeightsHolder, FactHandle, Logger)
>    org.drools.base.DefaultKnowledgeHelper.update(FactHandle, long)
>    org.drools.common.NamedEntryPoint.update(FactHandle, Object, long,
> Activation)
>    org.drools.common.NamedEntryPoint.update(FactHandle, Object, long,
> Activation)
>
>  org.drools.common.PropagationContextImpl.evaluateActionQueue(InternalWorkingMemory)
>
>  org.drools.reteoo.ReteooWorkingMemory$EvaluateResultConstraints.execute(InternalWorkingMemory)
>
>  org.drools.reteoo.AccumulateNode.evaluateResultConstraints(AccumulateNode$ActivitySource,
> LeftTuple, PropagationContext, InternalWorkingMemory,
> AccumulateNode$AccumulateMemory, AccumulateNode$AccumulateContext, boolean)
>    org.drools.common.DefaultFactHandle.setObject(Object)
>    java.util.AbstractList.hashCode()
>
>  I believe the following clues can be extracted:
>
>  - "Rule_Set_weights" was fired and a fact was modified (confirmed by
> examining the rule definition)
> - The fact modification caused the pre-conditions for other rules to be
> computed.
> - One of these rules has an accumulate condition that accumulates into an
> AbstractList.
> - This list is very very large. So large that looping through the elements
> in the list and aggregating the hashCode of individual elements dominates
> execution time (the individual element hashCode doesn't even show up in the
> profile… either its very fast or maybe its identify hashCode which the
> profiler might filter?).
> - Accumulate is either working on a large set of data or the same
> accumulate is evaluated many many times.
>
>  Is my analysis correct? Are there clues that I am missing?
>
>  I have 15 rules that use accumulate… However none accumulate with a
> result of List. Most accumulate using sum() and count() (result of Number).
> A few use collectSet(). A few more aggregate into a result with a custom
> type.
>
>  A few other notes:
> - All accumulate conditions are the last condition in the WHEN clause.
> - I use agenda groups to separate fact processing into phases. Rules that
> accumulate are in a separate agenda group from rules that modify/insert
> facts that are used in accumulation. I hope this prevents the accumulate
> condition from being evaluated until all the rules that modify the facts
> accumulate needs are done firing. I suspect this may not be working as I
> expect. I haven't put together an example to investigate.
> - When accumulating into a set, the rule condition looks like this:
>     $factName : Set() from accumulate( FactMatch( $field : field ),
> collectionSet( $field ) )
>
>  How can I narrow down this further?
>
>  Are there any general rules to follow to optimize use of accumulate in
> conditions?
>
>  Thanks,
>
>  Ryan
>
>
> _______________________________________________
> rules-users mailing listrules-users at lists.jboss.orghttps://lists.jboss.org/mailman/listinfo/rules-users
>
>
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20130109/2e92aeb7/attachment.html 


More information about the rules-users mailing list