Hi Greg,
Thanks for your help very much.
I have to new StatelessKnowledgeSession for every request, and I test new 
StatelessKnowledgeSession in my machine. 
It costs 310ms for 1000 times.

With insert, retract I can keep the StatefulKnowledgeSession instance.
I will look into StatelessKnowledgeSession.
Thanks very much again.

在2009-07-21,"Greg Barton" <[email protected]> 写道:
>
>There's no reason why you have to process all of your rules at once, or in one 
>way.  For instance, if the processing of this large set of "what's the 
>decision" rules depend on nothing else, there's no reason they can't be in 
>their own ruleset and processed separately in a  StatelessKnowledgeSession.  
>The results can then be passed to the rest of the rules.  
>
>In addition, if you do have other rules, then your testing setup is 
>unrealistic. (i.e. throwing in one instance of each type, processing the 
>rules, then retracting them all.)  
>
>--- On Tue, 7/21/09, nesta <[email protected]> wrote:
>
>> From: nesta <[email protected]>
>> Subject: Re: [rules-users] optimization on a lot of simple rules
>> To: [email protected]
>> Date: Tuesday, July 21, 2009, 12:44 AM
>> 
>> Agree, but I can't choose sequential mode for several
>> reason.
>> Sequential mode means StatelessKnowledgeSession.
>> 1. every request needs to create a new session(working
>> memory).
>> 2. our ruleset has other rules.
>> 3. with StatefulKnowledgeSession, some facts can be
>> initialized before
>> process the request.
>> 4. Agenda is needed.
>> 
>> Thanks very much.
>> 
>> 
>> Greg Barton wrote:
>> > 
>> > 
>> > Well, if your rules are going to be that simple, have
>> you tried sequential
>> > mode?? If there's never any reaction to working
>> memory changes you don't
>> > need the rete network.? You should get much
>> better performance out of that
>> > ruleset, and others like it, in sequential mode.
>> > 
>> > See
>> > http://downloads.jboss.com/drools/docs/5.0.1.26597.FINAL/drools-expert/html_single/index.html,
>> > section "3.3.7.1. Sequential Mode"
>> > 
>> > In a nutshell, the rete network is used for tracking
>> and reacting to
>> > changes in the objects inserted into working memory.
>> (i.e. a rule fires,
>> > changes a WM object, then other rules may be eligible
>> to fire based on
>> > that change.) If you're not going to be using that
>> functionality you'd be
>> > constructing and maintaining the rete for no
>> reason.? 
>> > 
>> > --- On Mon, 7/20/09, nesta <[email protected]>
>> wrote:
>> > 
>> >> From: nesta <[email protected]>
>> >> Subject: Re: [rules-users] optimization on a lot
>> of simple rules
>> >> To: [email protected]
>> >> Date: Monday, July 20, 2009, 10:13 PM
>> >> 
>> >> I execute above test codes, with 100 rules running
>> 1000
>> >> times. In the same
>> >> time, I profile the test codes.
>> >> http://www.nabble.com/file/p24581025/profile.jpg 
>> >> The profile result shows that some methods execute
>> 100,000
>> >> times.
>> >> In test codes, 
>> >> Service has two states, 0 or 1.
>> >> Subscriber has two states, 0 or 1.
>> >> 
>> >> inserted facts:
>> >> Product product = new Product(1, 1);
>> >> Service service = new Service(1);
>> >> Subscriber subscriber = new Subscriber(1);
>> >> 
>> >> Service matches a half of total rules, namely 50.
>> So is
>> >> Subscriber.
>> >> (50 + 50 ) * 1000 (running times) = 100,000
>> >> 
>> >> I am confused what drools does. Is there a way to
>> optimize
>> >> it?
>> >> 
>> >> 
>> >> Greg Barton wrote:
>> >> > 
>> >> > 
>> >> > 1) Yes, if you eliminate joins in rules, you
>> will have
>> >> no joins in the
>> >> > rete.? This is self evident.
>> >> > 
>> >> > 2) The way you have the rules structured,
>> there is no
>> >> relationship between
>> >> > the joined objects.? This will cause what's
>> >> called a "cartesian join"
>> >> > where all combinations of all instances of
>> each object
>> >> type are
>> >> > instantiated.? This can be very expensive,
>> memory
>> >> and CPU wise.? You've
>> >> > stated that there are only one instance of
>> each object
>> >> type in working
>> >> > memory, but are you absolutely sure of
>> that??
>> >> Cartesian joins can easily
>> >> > cause performance problems quite quickly.
>> >> > 
>> >> > For instance, say you've got these objects in
>> working
>> >> memory:
>> >> > 
>> >> > Subscriber(gender="male")
>> >> > Subscriber(gender="female")
>> >> > Service(name="ftp")
>> >> > Service(name="http")
>> >> > Product(id=1)
>> >> > Product(id=2)
>> >> > Product(id=3)
>> >> > 
>> >> > After inserting a Decision into working
>> memory, the
>> >> rule will fire 2*2*3
>> >> > times.? (#Subscribers * #Services *
>> #Products)
>> >> This is by design.? Is this
>> >> > what you want?
>> >> > 
>> >> > 3) Do you really need the 'Subscriber(gender
>> == "male"
>> >> or "female")' term? 
>> >> > Why not just 'Subscriber()'?? Are you
>> classifying
>> >> transgendered or
>> >> > nonhuman subscribers in your system?
>> >> > 
>> >> > --- On Mon, 7/20/09, nesta <[email protected]>
>> >> wrote:
>> >> > 
>> >> >> From: nesta <[email protected]>
>> >> >> Subject: Re: [rules-users] optimization
>> on a lot
>> >> of simple rules
>
>> >> >> To: [email protected]
>> >> >> Date: Monday, July 20, 2009, 10:22 AM
>> >> >> 
>> >> >> I want to test the matching performance
>> of drools.
>> >> As I
>> >> >> mentioned that there
>> >> >> are a lot of rules and? the rule is
>> like:
>> >> >> rule 1
>> >> >> ? ? when
>> >> >> ? ? ? ? ? Decision()
>> >> >> ? ? ? ???Subscriber(gender ==
>> >> >> "male" or "female")
>> >> >> ? ? ? ???Service(name ==
>> >> >> "ftp" or "http")
>> >> >> ? ? ? ???Product(id == 1)
>> >> >> ? ? ? ? ? ......
>> >> >> ? ? then
>> >> >> end
>> >> >> 
>> >> >> After test, more condition elements under
>> when,
>> >> more time
>> >> >> needs to execute
>> >> >> the test.
>> >> >> for example
>> >> >> Location ( location == "home" or
>> "office")
>> >> >> and so on.
>> >> >> So I worry about the matching performance
>> with
>> >> drools.
>> >> >> 
>> >> >> I found that a lot of JoinNodes would be
>> executed
>> >> in
>> >> >> runtime. I mean if
>> >> >> there is 1000 rules, there will be a lot
>> of
>> >> JoinNodes
>> >> >> (There are at least
>> >> >> 1000 JoinNodes between Decision and
>> Product ). And
>> >> it
>> >> >> exactly affects the
>> >> >> execution performance.
>> >> >> 
>> >> >> As you know, Decision, Product, Servcie
>> and so on
>> >> are plan
>> >> >> Java classes. If
>> >> >> I define all of attributes of above
>> classes in one
>> >> class
>> >> >> named WholeFact,
>> >> >> only one Java Type, there is no mentioned
>> issue.
>> >> >> 
>> >> >> With WholeFact class, the rule will be
>> changed as
>> >> follows:
>> >> >> rule 1
>> >> >> ? ? when
>> >> >> ? ? ? ? ? WholeFact(
>> >> >> subscriberGender == "male" or "female",
>> >> >> ? ? ? ? ? ? ? ?
>> >> >> ? ? ? ? ? ? ? serviceName
>> >> >> == "ftp" or "http",
>> >> >> ? ? ? ? ? ? ? ?
>> >> >> ? ? ? ? ? ?
>> >> >> ???productId == 1 or 2 or 3 ...
>> >> >> ? ? ? ? ? )
>> >> >> ? ? then
>> >> >> end
>> >> >> 
>> >> >> 
>> >> >> Greg Barton wrote:
>> >> >> > 
>> >> >> > 
>> >> >> > Now this finally rises to something
>> that
>> >> needs rules.
>> >> >> :)? In all of the
>> >> >> > previous examples you've given you
>> could just
>> >> have a
>> >> >> > Map<ProductKey,Handler> where
>> the
>> >> Handler looks
>> >> >> like this:
>> >> >> > 
>> >> >> > interface Handler {
>> >> >> >???void handle(Product product,
>> Decision
>> >> >> decision);
>> >> >> > }
>> >> >> > 
>> >> >> > ...and the ProductKey consists of
>> properties
>> >> that
>> >> >> uniquely identify how
>> >> >> > the Product is handled.? So, on
>> it's own,
>> >> that
>> >> >> functionality did not
>> >> >> > require rules.
>> >> >> > 
>> >> >> > However, now that you've introduced
>> more
>> >> complex
>> >> >> decisions, with varying
>> >> >> > data, to affect the Decision for
>> each
>> >> Property type,
>> >> >> rules are more
>> >> >> > appropriate.
>> >> >> > 
>> >> >> > Is there any reason why you only
>> have one of
>> >> each
>> >> >> object type in memory at
>> >> >> > one time?? Maybe if you state more
>> of the
>> >> problem
>> >> >> requirements we can help
>> >> >> > you better.
>> >> >> > 
>> >> >> > --- On Mon, 7/20/09, nesta <[email protected]>
>> >> >> wrote:
>> >> >> > 
>> >> >> >> From: nesta <[email protected]>
>> >> >> >> Subject: Re: [rules-users]
>> optimization
>> >> on a lot
>> >> >> of simple rules
>> >> >> >> To: [email protected]
>> >> >> >> Date: Monday, July 20, 2009,
>> 4:14 AM
>> >> >> >> 
>> >> >> >> Thanks very much.
>> >> >> >> But if for every rule, there is
>> one
>> >> algorithm or
>> >> >> discount
>> >> >> >> which means that
>> >> >> >> result has nothing related with
>> Product's
>> >> id and
>> >> >> usage. I
>> >> >> >> can't merge all
>> >> >> >> rules in one rule. At the same
>> time,
>> >> besides
>> >> >> Product and
>> >> >> >> Decision fact type,
>> >> >> >> there are more fact types.
>> >> >> >> For example:
>> >> >> >> rule 1
>> >> >> >> ? ? when
>> >> >> >> ? ? ? ???Decision()
>> >> >> >> ? ? ? ???Subscriber(gender
>> ==
>> >> >> >> "male" or "female")
>> >> >> >> ? ? ? ???Service(name ==
>> >> >> >> "ftp" or "http")
>> >> >> >> ? ? ? ???Product(id == 1)
>> >> >> >> ? ? ? ???......
>> >> >> >> ???then
>> >> >> >> ? ? ? ???......
>> >> >> >> end
>> >> >> >> rule 2
>> >> >> >> ? ? when
>> >> >> >> ? ? ? ???Decision()
>> >> >> >> ? ? ? ???Subscriber(gender
>> ==
>> >> >> >> "male" or "female")
>> >> >> >> ? ? ? ???Service(name ==
>> >> >> >> "ftp" or "http")
>> >> >> >> ? ? ? ???Product(id == 2)
>> >> >> >> ? ? ? ???......
>> >> >> >> ???then
>> >> >> >> ? ? ? ???......
>> >> >> >> end
>> >> >> >> 
>> >> >> >> .....
>> >> >> >> .....
>> >> >> >> 
>> >> >> >> In this scenario, if there are
>> 1000
>> >> rules,? there
>> >> >> will
>> >> >> >> be a lot of JoinNode.
>> >> >> >> But in runtime, there is only
>> one
>> >> Decision
>> >> >> instance, one
>> >> >> >> Subscriber instance
>> >> >> >> and Service instance.
>> >> >> >> 
>> >> >> >> If I define all data in one fact
>> type, I
>> >> think
>> >> >> that there
>> >> >> >> are not a lot of
>> >> >> >> JoinNodes.
>> >> >> >> 
>> >> >> >> Is there any other method?
>> >> >> >> 
>> >> >> >> 
>> >> >> >> 
>> >> >> >> Wolfgang Laun-2 wrote:
>> >> >> >> > 
>> >> >> >> > Well, what is the realtion
>> between
>> >> id, usage
>> >> >> and the
>> >> >> >> result that's to be
>> >> >> >> > stored in a Decision or a
>> global?
>> >> >> >> > 
>> >> >> >> > Typically, such rules could
>> be
>> >> written as
>> >> >> >> > 
>> >> >> >> > rule x
>> >> >> >> > no-loop true
>> >> >> >> > when
>> >> >> >> >? ???$d : Decision()
>> >> >> >> >? ???$p :Product( id ==
>> 1, $usage
>> >> :
>> >> >> >> usage )
>> >> >> >> > then
>> >> >> >> >? ???compute/store
>> value,
>> >> depending
>> >> >> >> on the formula for id == 1
>> (using
>> >> >> >> > usage)
>> >> >> >> > end
>> >> >> >> > // similar rule for id ==
>> 2,3,...
>> >> >> >> > 
>> >> >> >> > If value is a
>> straightforward
>> >> function of id
>> >> >> (and
>> >> >> >> usage), then implement a
>> >> >> >> > function compValue and use
>> a single
>> >> rule,
>> >> >> e.g.:
>> >> >> >> > 
>> >> >> >> > rule x
>> >> >> >> > no-loop true
>> >> >> >> > when
>> >> >> >> >? ???$d : Decision()
>> >> >> >> >? ???Product( $id : id,
>> $usage :
>> >> >> >> usage)
>> >> >> >> > then
>> >> >> >> >? ? modify $d value to
>> compValue(
>> >> $id,
>> >> >> $usage
>> >> >> >> )
>> >> >> >> > 
>> >> >> >> > Distinguishing all
>> individual
>> >> combinations of
>> >> >> id and
>> >> >> >> usage on the LHS
>> >> >> >> > seems
>> >> >> >> > excessive.
>> >> >> >> > 
>> >> >> >> > The ordering of CEs also
>> affects
>> >> execution
>> >> >> times.
>> >> >> >> > 
>> >> >> >> > -W
>> >> >> >> > 
>> >> >> >> > On 7/20/09, nesta <[email protected]>
>> >> >> >> wrote:
>> >> >> >> >>
>> >> >> >> >>
>> >> >> >> >> In this scenario, there
>> are
>> >> 1000
>> >> >> products,
>> >> >> >> different product has
>> >> >> >> >> different
>> >> >> >> >> price, besides this,
>> the price
>> >> is
>> >> >> affected by
>> >> >> >> usage. I want to use
>> >> >> >> >> Product.id to match the
>> rules.
>> >> >> >> >>
>> >> >> >> >> As you mentioned "The
>> crude
>> >> duplication
>> >> >> of rules
>> >> >> >> where only the constant
>> >> >> >> >> to
>> >> >> >> >> be matched with
>> >> >> >> >> Product.id varies can,
>> most
>> >> likely, be
>> >> >> avoided."
>> >> >> >> >>
>> >> >> >> >> How to avoid it in
>> this
>> >> scenario?
>> >> >> >> >>
>> >> >> >> >>
>> >> >> >> >> Wolfgang Laun-2 wrote:
>> >> >> >> >> >
>> >> >> >> >> > It's difficult to
>> suggest
>> >> an
>> >> >> optimized form
>> >> >> >> for your rules 1-infinity,
>> >> >> >> >> > since
>> >> >> >> >> > we do not know
>> what you
>> >> want to
>> >> >> achieve.
>> >> >> >> >> >
>> >> >> >> >> > The crude
>> duplication of
>> >> rules where
>> >> >> only the
>> >> >> >> constant to be matched
>> >> >> >> >> with
>> >> >> >> >> > Product.id varies
>> can, most
>> >> likely,
>> >> >> be
>> >> >> >> avoided.
>> >> >> >> >> >
>> >> >> >> >> > -W
>> >> >> >> >> >
>> >> >> >> >> >
>> >> >> >> >> >
>> >> >> >> >> > On Sun, Jul 19,
>> 2009 at
>> >> 3:15 PM,
>> >> >> nesta <[email protected]>
>> >> >> >> wrote:
>> >> >> >> >> >
>> >> >> >> >> >>
>> >> >> >> >> >> Hi,
>> >> >> >> >> >>
>> >> >> >> >> >> I am a newbie
>> in
>> >> drools. There
>> >> >> are a lot
>> >> >> >> of simple rules in a
>> >> >> >> >> scenario.
>> >> >> >> >> >> For example
>> >> >> >> >> >> rule 1
>> >> >> >> >> >>? ? when
>> >> >> >> >> >>? ? ? ?
>> Product( id
>> >> >> >> ==1, usage == 1)
>> >> >> >> >> >>? ? ? ?
>> $decision :
>> >> >> >> Decision()
>> >> >> >> >> >>? ? then
>> >> >> >> >> >>? ? ?
>> >> >> >> ???$decision.setValue(1);
>> >> >> >> >> >> end
>> >> >> >> >> >>
>> >> >> >> >> >> rule 2
>> >> >> >> >> >> when Product(
>> id ==2,
>> >> usage ==
>> >> >> 1)
>> >> >> >> >> >>? $decision :
>> >> Decision()
>> >> >> >> >> >> rule 3
>> >> >> >> >> >> when Product(
>> id ==3,
>> >> usage ==
>> >> >> 1)
>> >> >> >> >> >>? $decision :
>> >> Decision()
>> >> >> >> >> >> rule 4
>> >> >> >> >> >> when Product(
>> id ==4,
>> >> usage ==
>> >> >> 1)
>> >> >> >> >> >>? $decision :
>> >> Decision()
>> >> >> >> >> >> rule 5
>> >> >> >> >> >> when Product(
>> id ==5,
>> >> usage ==
>> >> >> 1)
>> >> >> >> >> >>? $decision :
>> >> Decision()
>> >> >> >> >> >> ......
>> >> >> >> >> >>
>> >> >> >> >> >> I have a
>> Product fact
>> >> whose id =
>> >> >> 5 and
>> >> >> >> usage = 1, in my first
>> >> >> >> >> thinking,
>> >> >> >> >> >> only
>> >> >> >> >> >> rule 5 is
>> matched,
>> >> there should
>> >> >> be not
>> >> >> >> much more different between 1
>> >> >> >> >> rule
>> >> >> >> >> >> and a lot of
>> rules in
>> >> runtime.
>> >> >> >> >> >>
>> >> >> >> >> >> But the result
>> shows
>> >> that they
>> >> >> are
>> >> >> >> different. More rules will cost
>> >> >> >> >> more
>> >> >> >> >> >> time. If there
>> are 1
>> >> thousand
>> >> >> rules, some
>> >> >> >> Node and Sink will execute 1
>> >> >> >> >> >> thousand
>> times.
>> >> >> >> >> >>
>> >> >> >> >> >> My question is
>> how to
>> >> optimize
>> >> >> this
>> >> >> >> scenario?
>> >> >> >> >> >> --
>> >> >> >> >> >> View this
>> message in
>> >> context:
>> >> >> >> >> >>
>> >> >> >> >>
>> >> >> >>
>> >> >>
>> >> http://www.nabble.com/optimization-on-a-lot-of-simple-rules-tp24556724p24556724.html
>> >> >> >> >> >> Sent from the
>> drools -
>> >> user
>> >> >> mailing list
>> >> >> >> archive at Nabble.com.
>> >> >> >> >> >>
>> >> >> >> >> >>
>> >> >> >>
>> >> _______________________________________________
>> >> >> >> >> >> rules-users
>> mailing
>> >> list
>> >> >> >> >> >> [email protected]
>> >> >> >> >> >> https://lists.jboss.org/mailman/listinfo/rules-users
>> >> >> >> >> >>
>> >> >> >> >> >
>> >> >> >> >> >
>> >> >> >>
>> >> _______________________________________________
>> >> >> >> >> > rules-users
>> mailing list
>> >> >> >> >> > [email protected]
>> >> >> >> >> > https://lists.jboss.org/mailman/listinfo/rules-users
>> >> >> >> >> >
>> >> >> >> >> >
>> >> >> >> >>
>> >> >> >> >> --
>> >> >> >> >> View this message in
>> context:
>> >> >> >> >>
>> >> >> >>
>> >> >>
>> >> http://www.nabble.com/optimization-on-a-lot-of-simple-rules-tp24556724p24563725.html
>> >> >> >> >> Sent from the drools -
>> user
>> >> mailing list
>> >> >> archive
>> >> >> >> at Nabble.com.
>> >> >> >> >>
>> >> >> >> >>
>> >> >>
>> _______________________________________________
>> >> >> >> >> rules-users mailing
>> list
>> >> >> >> >> [email protected]
>> >> >> >> >> https://lists.jboss.org/mailman/listinfo/rules-users
>> >> >> >> >>
>> >> >> >> > 
>> >> >> >> >
>> >> >>
>> _______________________________________________
>> >> >> >> > rules-users mailing list
>> >> >> >> > [email protected]
>> >> >> >> > https://lists.jboss.org/mailman/listinfo/rules-users
>> >> >> >> > 
>> >> >> >> > 
>> >> >> >> 
>> >> >> >> -- 
>> >> >> >> View this message in context:
>> >> >> >>
>> >> >>
>> >> http://www.nabble.com/optimization-on-a-lot-of-simple-rules-tp24556724p24566350.html
>> >> >> >> Sent from the drools - user
>> mailing list
>> >> archive
>> >> >> at
>> >> >> >> Nabble.com.
>> >> >> >> 
>> >> >> >>
>> >> _______________________________________________
>> >> >> >> rules-users mailing list
>> >> >> >> [email protected]
>> >> >> >> https://lists.jboss.org/mailman/listinfo/rules-users
>> >> >> >> 
>> >> >> > 
>> >> >> > 
>> >> >> >? ? ???
>> >> >> > 
>> >> >> >
>> >> _______________________________________________
>> >> >> > rules-users mailing list
>> >> >> > [email protected]
>> >> >> > https://lists.jboss.org/mailman/listinfo/rules-users
>> >> >> > 
>> >> >> > 
>> >> >> 
>> >> >> -- 
>> >> >> View this message in context:
>> >> >>
>> >> http://www.nabble.com/optimization-on-a-lot-of-simple-rules-tp24556724p24571875.html
>> >> >> Sent from the drools - user mailing list
>> archive
>> >> at
>> >> >> Nabble.com.
>> >> >> 
>> >> >> 
>> >> >>
>> _______________________________________________
>> >> >> rules-users mailing list
>> >> >> [email protected]
>> >> >> https://lists.jboss.org/mailman/listinfo/rules-users
>> >> >> 
>> >> > 
>> >> > 
>> >> >? ? ???
>> >> > 
>> >> >
>> _______________________________________________
>> >> > rules-users mailing list
>> >> > [email protected]
>> >> > https://lists.jboss.org/mailman/listinfo/rules-users
>> >> > 
>> >> > 
>> >> 
>> >> -- 
>> >> View this message in context:
>> >> http://www.nabble.com/optimization-on-a-lot-of-simple-rules-tp24556724p24581025.html
>> >> Sent from the drools - user mailing list archive
>> at
>> >> Nabble.com.
>> >> 
>> >> 
>> >> _______________________________________________
>> >> rules-users mailing list
>> >> [email protected]
>> >> https://lists.jboss.org/mailman/listinfo/rules-users
>> >> 
>> > 
>> > 
>> >? ? ???
>> > 
>> > _______________________________________________
>> > rules-users mailing list
>> > [email protected]
>> > https://lists.jboss.org/mailman/listinfo/rules-users
>> > 
>> > 
>> 
>> -- 
>> View this message in context: 
>> http://www.nabble.com/optimization-on-a-lot-of-simple-rules-tp24556724p24582029.html
>> Sent from the drools - user mailing list archive at
>> Nabble.com.
>> 
>> 
>> _______________________________________________
>> rules-users mailing list
>> [email protected]
>> https://lists.jboss.org/mailman/listinfo/rules-users
>> 
>
>
>      
>
>_______________________________________________
>rules-users mailing list
>[email protected]
>https://lists.jboss.org/mailman/listinfo/rules-users
_______________________________________________
rules-users mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/rules-users

Reply via email to