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(a)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(a)lists.jboss.org [mailto:rules-users-bounces@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(a)nds.com>:
> You should probably restrict it so that
>
> $cell2 : Cell(this != $cell1)
>
>
>
> Thomas
>
>
>
> From: rules-users-bounces(a)lists.jboss.org
> [mailto:rules-users-bounces@lists.jboss.org] On Behalf Of Ryan
> Fitzgerald
> Sent: 26 April 2010 15:34
> To: rules-users(a)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(a)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(a)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(a)lists.jboss.org
>
https://lists.jboss.org/mailman/listinfo/rules-users
>
>
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users