[rules-users] How to make this rule more memory efficient?

Ryan Fitzgerald ryan.fitzgerald at ericsson.com
Tue May 4 11:51:29 EDT 2010


Hi Wolfgang,

Sorry for the late reply on this.

Actually I did miss your earlier reply.

I applied the changes you suggested and made a few more tweaks and I have been able to get the memory down from over 1.5GB (where I was getting OOM exceptions) to 300MB.

I now realise that I have to be very careful how I define the patterns and order them. Thanks a million for your help.

/Ryan. 

-----Original Message-----
From: rules-users-bounces at lists.jboss.org [mailto:rules-users-bounces at lists.jboss.org] On Behalf Of Wolfgang Laun
Sent: 28 April 2010 10:25
To: Rules Users List
Subject: Re: [rules-users] How to make this rule more memory efficient?

Did you miss my earlier reply proposing an alternative order of patterns? ( I just saw that the second eval isn't necessary.) HEre is the revised form:

rule "Check consistent references"
when
       $proxy1 : ProxyCell()
       $cell1  : Cell( id == $proxy1.id )
       $proxy2 : ProxyCell( id > $proxy1.id,
                            eval( $cell1.references contains this.name ) )
       $cell2  : Cell( id == $proxy2.id, references not contains $proxy1.name ) then
       //report an error.....
end

-W

On Wed, Apr 28, 2010 at 10:45 AM, Ryan Fitzgerald <ryan.fitzgerald at ericsson.com> wrote:
> Thanks Wolfgang.
>
> Should I conclude therefore that high memory usage is unavoidable due to the number of facts that must be processed? I was hoping that there might be a clever way of writing the rules so that the rules engine can minimise the network it generates - even if it takes a little longer to execute.
>
> All of the facts are read from a database and thus loaded into working memory. My fallback position is to not load all these objects into working memory but instead embed into a rule, a service call that queries the db for all inconsistencies (effectively using SQL instead of a drools rule). However, since I will have other rules that operate on these objects in working memory, I was hoping to use these facts for all rules.
>
> /Ryan.
>
> -----Original Message-----
> From: rules-users-bounces at lists.jboss.org 
> [mailto:rules-users-bounces at lists.jboss.org] On Behalf Of Wolfgang 
> Laun
> Sent: 27 April 2010 14:59
> To: Rules Users List
> Subject: Re: [rules-users] How to make this rule more memory efficient?
>
> If there are n Cell facts,
>  $cell1 : Cell()
>  $cell2 : Cell()
> needs to create n*n pairs in the network before any reduction may set in.
> Using
>  $cell2 : Cell(this != $cell1)
> reduces this by n, so we're still quadratic. Something like
>  $cell1 : Cell( $id1 : id )
>  $cell2 : Cell( id > $id1 )
> reduces it to n*(n-1)/2 which is less than 50% of the original, but still quadratic.
>
> -W
>
> 2010/4/26 Swindells, Thomas <TSwindells at nds.com>:
>> You should probably restrict it so that
>>
>> $cell2 : Cell(this != $cell1)
>>
>>
>>
>> Thomas
>>
>>
>>
>> From: rules-users-bounces at lists.jboss.org
>> [mailto:rules-users-bounces at lists.jboss.org] On Behalf Of Ryan 
>> Fitzgerald
>> Sent: 26 April 2010 15:34
>> To: rules-users at lists.jboss.org
>> Subject: [rules-users] How to make this rule more memory efficient?
>>
>>
>>
>> Hi,
>>
>>
>>
>> Can anyone advise me on how to make a drools rule more memory efficient?
>> Here is the problem:
>>
>>
>>
>> I have a Cell and a ProxyCell object classes.
>>
>>
>>
>> The ProxyCell represents the Cell when their internal ID's match.
>>
>>
>>
>> Each Cell and ProxyCell however has a unique name (not same as ID).
>>
>>
>>
>> A Cell can reference (by name) a ProxyCell (as long as the ProxyCell 
>> does not represent that actual Cell - which would effectively be a 
>> self-reference and is not allowed).
>>
>>
>>
>> What I want to do is find out where I have a reference from any 
>> instance of Cell - cell1 - to any instance of ProxyCell - proxycell2 
>> - but am missing a reference from cell2 to proxycell1 where 
>> proxycell2 is a representation of
>> cell2 and proxycell1 is a representation of cell1.
>>
>>
>>
>> Here is the rule I have written for it:
>>
>>
>>
>> rule "Check consistent references"
>>
>> when
>>
>>         $cell1 : Cell()
>>
>>         $cell2 : Cell()
>>
>>         $proxycell1 : ProxyCell ( id = $cell1.id, $cell2.references 
>> contains this.name )
>>
>>         $proxycell2 : ProxyCell ( id = $cell2.id, $cell1.references 
>> not contains this.name )
>>
>> then
>>
>>         //report an error.....
>>
>> end
>>
>>
>>
>>
>>
>> I have 10,000 instances of Cell and 10,000 instances of ProxyCell in 
>> working memory. For each instance of Cell, it can have references to 
>> 60 different ProxyCell instances. Loading the Cell and ProxyCell 
>> instances into working memory is not a problem. However, when I try 
>> to run this rule above, the memory quickly goes above 1GB and I eventually get an out of memory error.
>>
>>
>>
>> I was wondering if there is a better way to structure or write this 
>> rule so that it doesn't use so much memory.
>>
>>
>>
>> Thanks,
>>
>> Ryan.
>>
>>
>>
>> ________________________________
>> *********************************************************************
>> *
>> **************** This message is confidential and intended only for 
>> the addressee. If you have received this message in error, please 
>> immediately notify the postmaster at nds.com and delete it from your 
>> system as well as any copies. The content of e-mails as well as 
>> traffic data may be monitored by NDS for employment and security 
>> purposes. To protect the environment please do not print this e-mail 
>> unless necessary.
>>
>> NDS Limited. Registered Office: One London Road, Staines, Middlesex,
>> TW18 4EX, United Kingdom. A company registered in England and Wales.
>> Registered no. 3080780. VAT no. GB 603 8808 40-00
>> *********************************************************************
>> *
>> ****************
>>
>> ________________________________
>> This message is confidential and intended only for the addressee. If 
>> you have received this message in error, please immediately notify 
>> the postmaster at nds.com and delete it from your system as well as any 
>> copies. The content of e-mails as well as traffic data may be 
>> monitored by NDS for employment and security purposes.
>> To protect the environment please do not print this e-mail unless necessary.
>>
>> An NDS Group Limited company. www.nds.com
>>
>> _______________________________________________
>> rules-users mailing list
>> rules-users at lists.jboss.org
>> https://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
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://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




More information about the rules-users mailing list