[rules-users] Reclaiming memory usage

Chris Richmond crichmond at referentia.com
Tue Jul 26 09:11:08 EDT 2011


Ok, well how to make them marry only those alive(<100 years old) and 
ensure all those over 100 years old go out of memory?

Chris

On 7/25/2011 2:32 PM, Edson Tirelli wrote:
>
>    Chris
>
>    That defines the expiration policy for ReconfigEvent, but it does 
> not define the relationship between ReconfigEvent and DataReading. 
> Imagine a timeline, dotted with ReconfigEvents... what your rule is 
> saying is for each DataReading event, match it with all the "periods 
> where there is no ReconfigEvent", as the lifetime of DataReading is 
> infinity.
>
>    Maybe a simpler way of understanding it (without using the "not" 
> for simplification) is think about this:
>
> declare Man
>    @livesUpTo( 100 years )
> end
>
> rule "marriage"
> when
>    $w : Woman( age > 18 )
>    $m : Man( )
> then
>    // marry woman and man
> end
>
>     The rule above defines that each woman will merry every existing 
> man, even if each of them only lives for 100 years.
>
>     Edson
>
> 2011/7/26 Chris Richmond <crichmond at referentia.com 
> <mailto:crichmond at referentia.com>>
>
>     Edson,
>
>     I was under the impression that this:
>
>
>     declare ReconfigEvent
>         @role( event )
>         @expires ( 5s )
>     end
>
>     would cover that, meaning that every ReconfigEvent would expire
>     after 5s, thus causing to no longer be needed by the engine.
>
>     Thanks,
>     Chris
>
>
>     On 7/25/2011 12:17 PM, Edson Tirelli wrote:
>>
>>        Chris,
>>
>>        I haven't tried your code, but just looking at the rule, there
>>     is no temporal correlation between DataReading and ReconfigEvent,
>>     so if I am not mistaken, that will create a required interval of
>>     infinite time when the temporal reasoning is applied, meaning the
>>     engine has to keep the readings in memory forever.
>>
>>        Adding a temporal constraint on the ReconfigEvent pattern on
>>     your rule or defining an explicit expiration policy for the
>>     DataReadings are ways to work around that.
>>
>>        Edson
>>
>>     2011/7/26 Chris Richmond <crichmond at referentia.com
>>     <mailto:crichmond at referentia.com>>
>>
>>         Hello
>>
>>         I am performing a simple test of injecting an event every 1
>>         millisecond
>>         like so:
>>
>>               for (int x = 0; x < 100000; x++){
>>                 DataReading dr = new DataReading("Reading " + x, 12.0f);
>>                 myStream.insert(dr);
>>                 ksession.fireAllRules();
>>                 Thread.sleep(1);
>>
>>               }
>>
>>
>>         The rule that evaluates this is simple.  It basically delays
>>         "then" for
>>         3s to see if a followup reading is inserted and makes sure
>>         that no
>>         ReconfigEvent is active(5s expiration).
>>
>>         So if a reading comes in and a followup reading is not
>>         inserted within 3
>>         seconds and there is is not an existing ReconfigEvent event
>>         alive, then
>>         it should output and insert a ReconfigEvent, essentially
>>         disabling any
>>         DataReading action on those events for the next 5 seconds or
>>         so.  This
>>         all works just fine as expected.
>>
>>         My question is, how come I don't get memory back when all
>>         100,000 of my
>>         events have been inserted.  Memory goes up slowly over the
>>         course of
>>         insertions, which I can understand, but once that loop is
>>         finished,
>>         memory never reduces, so essentially, the application will
>>         eventually
>>         run out of memory after some time.   I should not have to
>>         explicitly
>>         remove/retract events should I? Shouldn't they be removed
>>         from working
>>         memory as soon as they are no longer viable?  What should I
>>         be doing to
>>         reclaim memory from the session/knowledgebase?
>>
>>         I have included the full Main program here and the Sample.drl
>>         file below it.
>>
>>         ************FusionMain.java*****************
>>
>>         package com.sample;
>>
>>         import org.drools.KnowledgeBase;
>>         import org.drools.KnowledgeBaseConfiguration;
>>         import org.drools.KnowledgeBaseFactory;
>>         import org.drools.builder.KnowledgeBuilder;
>>         import org.drools.builder.KnowledgeBuilderError;
>>         import org.drools.builder.KnowledgeBuilderErrors;
>>         import org.drools.builder.KnowledgeBuilderFactory;
>>         import org.drools.builder.ResourceType;
>>         import org.drools.conf.EventProcessingOption;
>>         import org.drools.io.ResourceFactory;
>>         import org.drools.logger.KnowledgeRuntimeLogger;
>>         import org.drools.logger.KnowledgeRuntimeLoggerFactory;
>>         import org.drools.runtime.KnowledgeSessionConfiguration;
>>         import org.drools.runtime.StatefulKnowledgeSession;
>>         import org.drools.runtime.conf.ClockTypeOption;
>>         import org.drools.runtime.rule.WorkingMemoryEntryPoint;
>>
>>
>>         public class FusionMain {
>>
>>           @SuppressWarnings("restriction")
>>           public static void main(String[] args) {
>>
>>
>>             try {
>>
>>               KnowledgeSessionConfiguration config =
>>         KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
>>               config.setOption( ClockTypeOption.get("realtime") );
>>
>>
>>               KnowledgeBase kbase;
>>               kbase = readKnowledgeBase();
>>               StatefulKnowledgeSession ksession =
>>         kbase.newStatefulKnowledgeSession();
>>
>>               WorkingMemoryEntryPoint myStream =
>>         ksession.getWorkingMemoryEntryPoint("My Stream");
>>
>>               for (int x = 0; x < 100000; x++){
>>                 DataReading dr = new DataReading("Reading " + x, 12.0f);
>>                 myStream.insert(dr);
>>                 ksession.fireAllRules();
>>                 Thread.sleep(1);
>>
>>               }
>>
>>             } catch (Exception e) {
>>               // TODO Auto-generated catch block
>>               e.printStackTrace();
>>             }
>>
>>           }
>>
>>           @SuppressWarnings("restriction")
>>           private static KnowledgeBase readKnowledgeBase() throws
>>         Exception {
>>             KnowledgeBuilder kbuilder =
>>         KnowledgeBuilderFactory.newKnowledgeBuilder();
>>            
>>         kbuilder.add(ResourceFactory.newClassPathResource("Sample.drl"),
>>         ResourceType.DRL);
>>             KnowledgeBuilderErrors errors = kbuilder.getErrors();
>>             if (errors.size() > 0) {
>>               for (KnowledgeBuilderError error: errors) {
>>                 System.err.println(error);
>>               }
>>               throw new IllegalArgumentException("Could not parse
>>         knowledge.");
>>             }
>>
>>             KnowledgeBaseConfiguration kbConfig =
>>         KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
>>             kbConfig.setOption( EventProcessingOption.STREAM );
>>             KnowledgeBase kbase =
>>         KnowledgeBaseFactory.newKnowledgeBase(kbConfig);
>>             kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
>>
>>
>>             return kbase;
>>           }
>>
>>
>>         }
>>
>>
>>         *********Sample.drl*************************
>>
>>         package com.sample
>>
>>
>>         import java.util.Date;
>>
>>         declare DataReading
>>             @role( event )
>>         end
>>
>>
>>         declare ReconfigEvent
>>             @role( event )
>>             @expires ( 5s )
>>         end
>>
>>
>>
>>         rule "Wait for follup reading or no config"
>>         //lock-on-active
>>         when
>>
>>             $dr: DataReading(reading > 10.0) from entry-point "My Stream"
>>             not(DataReading(reading < 10.0, this after[0s,3s] $dr) from
>>         entry-point "My Stream")
>>             not(ReconfigEvent() from entry-point "My Stream")
>>
>>         then
>>             System.err.println("Action: " + new
>>         Date(System.currentTimeMillis()));
>>             System.err.println("Data reading " + $dr.getName() + " >
>>         10");
>>             ReconfigEvent rce = new ReconfigEvent();
>>             entryPoints["My Stream"].insert( rce );
>>
>>         end
>>
>>
>>
>>
>>
>>
>>         _______________________________________________
>>         rules-users mailing list
>>         rules-users at lists.jboss.org <mailto:rules-users at lists.jboss.org>
>>         https://lists.jboss.org/mailman/listinfo/rules-users
>>
>>
>>
>>
>>     -- 
>>       Edson Tirelli
>>       JBoss Drools Core Development
>>       JBoss by Red Hat @ www.jboss.com <http://www.jboss.com>
>>
>>
>>     _______________________________________________
>>     rules-users mailing list
>>     rules-users at lists.jboss.org  <mailto:rules-users at lists.jboss.org>
>>     https://lists.jboss.org/mailman/listinfo/rules-users
>
>
>     _______________________________________________
>     rules-users mailing list
>     rules-users at lists.jboss.org <mailto:rules-users at lists.jboss.org>
>     https://lists.jboss.org/mailman/listinfo/rules-users
>
>
>
>
> -- 
>   Edson Tirelli
>   JBoss Drools Core Development
>   JBoss by Red Hat @ www.jboss.com <http://www.jboss.com>
>
>
> _______________________________________________
> 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/20110726/22ec99f7/attachment.html 


More information about the rules-users mailing list