[rules-users] Reclaiming memory usage

Chris Richmond crichmond at referentia.com
Tue Jul 26 07:45:16 EDT 2011


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
> 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/a842bf26/attachment.html 


More information about the rules-users mailing list