The recipe book described a 

class TreeProxy(object): ...

which implements unordered tree traversal. It is the most efficient way to 
store records in a tree and retrieve them efficiently in a single query.
Anyway, if this is the bottle neck, you should definitively cache it 
somehow.


On Saturday, 7 April 2012 10:42:03 UTC-5, Detectedstealth wrote:
>
> Well I know the major bottle neck in the site is the binary tree. I am 
> still trying to figure out how to do this the best and most efficient. If 
> this was a stand alone app in c/c++ this would all be in memory which 
> wouldn't be such a problem. However how this is implemented it needs to 
> query through the database to find nodes. As you can imagine as we get more 
> and more members this will take much longer to run. 
>
> See bellow code, binary_tree is called from a action and distributor is a 
> database object IE: db(db.distributors.id == id).select().first()
>
> def binary_tree(self, original_dist, distributor, levels, counter=0, 
> month=None):
>
>         
>         children = []
>         left_count = right_count = counter
>
>         target_month = month
>         
>         if distributor.left_id and left_count < levels:
>
>             left_count += 1
>             #print "left - A", distributor.left_id
>
>             children.append(self.binary_tree(original_dist, 
> distributor.left_id, levels, left_count, target_month))
>
>         
>         if distributor.right_id and right_count < levels:
>
>             right_count += 1
>             #print "right - B", distributor.right_id
>
>             children.append(self.binary_tree(original_dist, 
> distributor.right_id, levels, right_count, target_month))
>
>                 
>         if distributor.sponsor_id == original_dist:
>
>             sponsored_by_original = True
>         else:
>
>             sponsored_by_original = False
>             
>         tree = {
>
>             'id': ("B" if distributor.side else "A") + "-" + 
> str(distributor.id),
>
>             'name': "<img src='/static/images/" + \
>
>             ("top_tree_icon.png" if distributor.id == original_dist else 
> ("sponsored_tree_icon.png" if sponsored_by_original else  
> "user_tree_icon.png")) + \
>
>             "' id='img-" + ("B" if distributor.side else "A") + "-" + 
> str(distributor.id) + "' /><span class='idlabel'>" + \
>
>             str("0"*(7-len(str(distributor.id))))+str(distributor.id) + "-" + 
> ("B" if distributor.side else "A") + \
>
>             "</span><div class='userinfo' id='id-" + ("B" if distributor.side 
> else "A") + "-" + \
>
>             str(distributor.id) + "'><ul><li class='userinfotop'><h4>" + 
> distributor.display_name + "</h4><span>" + \
>
>             self.T("A CV:") + "<b>" + 
> (str(distributor.left_id.binary_cv_total) if distributor.left_id else str(0)) 
> + \
>
>             "</b></span><span>" + self.T("B CV:") + "<b>" + 
> (str(distributor.right_id.binary_cv_total) if distributor.right_id else 
> str(0)) + \
>
>             "</b></span></li><li  class='userinfobottom'><p>" + 
> self.T("Sponsored by me ") + (self.T("YES") if sponsored_by_original else 
> self.T("NO")) + \
>
>             "</p><p>" + (self.T("Has down lines") if distributor.right_id or 
> distributor.left_id else self.T("Has no down lines")) + "</p><p>" + \
>
>             (self.T("Disqualified ") if not distributor.quali_bonus else 
> self.T("Qualified ")) + self.T("to get bonus") + "</p></li></ul></div>",
>
>             'children': children
>         }
>       
>         return tree
>
> *# This is the biggest bottle neck of our entire application. Need a much 
> better way to handle tree traversing.*
>
> def traversingTree(self, distributor, list):        
>
>         if distributor:
>             left_node = distributor.left_id
>
>             right_node = distributor.right_id
>             if left_node:
>
>                 list.append(left_node)
>                 self.traversingTree(left_node,list)
>
>         
>             if right_node:
>                 list.append(right_node)
>
>                 self.traversingTree(right_node,list)
>
>     
>     def bottom_right_b(self, distributor):
>
>         right_id = None
>         cur_dist = distributor
>         while cur_dist.right_id:
>
>             right_id = cur_dist.right_id
>             cur_dist = cur_dist.right_id
>
>         print "Right Bottom", right_id
>         return right_id
>
>     
>     def bottom_left_a(self, distributor):
>
>         left_id = None
>         cur_dist = distributor
>         while cur_dist.left_id:
>
>             left_id = cur_dist.left_id
>             cur_dist = cur_dist.left_id
>
>         print "Left Bottom", left_id
>         return left_id
>
>
>
> On Sat, Apr 7, 2012 at 8:16 AM, Massimo Di Pierro <
> massimo.dipie...@gmail.com> wrote:
>
>> Right....what? [changing color to red] Note to self. Never do math before 
>> fully waking up. 
>>
>> Correction: 2 reqs/second/server. (1M/24/60/60/6 servers). Still ok from 
>> web2py prospective.
>> If all requests hit the database once: 12 reqs/second. It really depends 
>> of what those requests do.
>>
>> Massimo
>>
>> On Saturday, 7 April 2012 09:33:38 UTC-5, Anthony wrote:
>>>
>>> 1M reqs/day is 7 reqs/minute.
>>>>
>>>
>>> Now we know how Massimo gets so much done -- his days are 2400 hours 
>>> long. ;-) 
>>>
>>
>
>
> -- 
> -- 
> Regards,
> Bruce Wade
> http://ca.linkedin.com/in/brucelwade
> http://www.wadecybertech.com
> http://www.fittraineronline.com - Fitness Personal Trainers Online
> http://www.warplydesigned.com
>
>

Reply via email to