Hello everybody,
I'm using drools 5.3.0-final to process events in stream mode with a pseudo
clock. I have created an do-nothing rule as follows:
rule "Do nothing"
when
$m : Message( ) from entry-point fromDb
then
end
Then I add a big number of events:
Calendar timestamp = new GregorianCalendar(2011, Calendar.DECEMBER, 10, 12,
0, 0);
for(int i = 0;i < 100000;i++) {
Message message = new Message("test", timestamp.getTime());
advanceSessionClock(pseudoClock, message.getTimestamp());
fromDb.insert(message); // <---
ksession.fireAllRules(); // <---
timestamp.add(Calendar.HOUR_OF_DAY, 1);
}
At the loop exit the memory usage is about 600MB. Increasing the number of
events increases also the ram usage up to about 1.4GB, then it remains
constant. If I don't insert the messages (lines with the comments), but I
still instantiate them, at the exit of the loop, the program requires only
90MB.
With the given rule, it's not necessary to store the events, so in theory
the insert() should do nothing... however, when the events are inserted, it
seems that drools performs a lot of useless work and allocates a lot of
memory. The fact that the consumption tops at 1.4GB (a quantity much higher
than the 90MB used by the messages alone) tells us that at that point the gc
is triggered and that drools correctly releases the references.
It seems pointless to optimize the engine for this case, but this happens
also when the rules are used as "filters" between streams:
rule "Filter test messages"
when
$m : Message( message == "test" ) from entry-point fromDb
then
entryPoints["testMessages"].insert($m);
end
rule "Only test messages"
when
$m : Message( ) from entry-point testMessages
then
end
How can I decrease the memory footprint for these simple rules?
--
MM
--
View this message in context:
http://drools.46999.n3.nabble.com/Empty-rule-and-event-retention-tp361677...
Sent from the Drools: User forum mailing list archive at
Nabble.com.