Thanks for the responses Kang and Robert. johnP
On Feb 9, 10:38 am, Robert Kluin <[email protected]> wrote: > We see very different performance depending on the exact structure of > our models and indexes. I have found that it really helps to just > setup test cases and try both when you have different implementation > ideas. And it may be the case that you need to use some combination > of the two approaches. > > Robert > > > > On Tue, Feb 9, 2010 at 12:50 PM, kang <[email protected]> wrote: > > According to Google engineer, fetch entry by key is very fast. So you should > > use fetch by key rather than manipulating the list. I think the B approach > > will cost more CPU also. > > > On Wed, Feb 10, 2010 at 1:38 AM, johnP <[email protected]> wrote: > > >> I'm trying to get my head around where to use the datastore for > >> business logic, and where to use python code. So just wanted to ask > >> two "which approach is better" questions: > > >> Scenario 1. For example, let's say you have a list of items, and you > >> need to return both the selected item as well as the list of items. > >> For example - a person has a bunch of cars: [Honda, Ford, Porsche, > >> Yugo, Trabaunt, Dusenberg]. You have stored the Yugo key as the > >> person's 'active_car'. > > >> You need to return: car, cars = Yugo, [Honda, Ford, > >> Porsche, Yugo, Trabaunt, Dusenberg] > > >> Which approach is better to return the values... > > >> Approach A: cars=person.car_set.fetch(1000) > >> car = db.get(stored_car_key) > >> return car, cars > > >> Approach B: cars = person.car_set.fetch(1000) > >> car = [i for i in cars if i.key() == > >> stored_car_key] > >> return car, cars > > >> In other words - what's cheaper - the list comprehension, or the > >> db.get(). If the person has 1000 cars, does the answer change? > > >> Scenario 2. I have a list of 300 people (In my case, there will never > >> be more than 1000) that I need to slice and dice in different ways. > >> a. Need them all, by last name, from California. b. Need people > >> between the ages of 25 and 35 in California. c. Need people over 300 > >> lbs in California. Which approach should I use: > > >> Approach A: Create multiple queries: > >> a. people = > >> state.people_set.order('last_name').fetch(1000) > >> b. people = > >> state.people_set.order('age').filter('age >', 35).etc. > >> c. people = > >> state.people_set.order(weight').filter('weight >', 300).etc. > > >> Approach B: Memcache the entire list of people, and > >> list_comprehension them into submission. For example: > > >> def return_people_by_last_name(): > >> people = get_all_people_from_memcache() > >> sort_list = [(i.last_name, i) for i in people > >> if i.state == state] > >> sort_list.sort() > >> return [i[1] for i in sort_list] > > >> def sort_people_by_weight(): > >> similar to above... > > >> In approach A, you'll be bearing the cost of additional indexes, as > >> well as bearing the cost that most of your returns will be hits to the > >> database. In approach B, you might be pulling 300 People from > >> memcache in order to return a single 300 pounder. > > >> Answers to these two questions might give me a better sense of when to > >> hit the datastore for business logic, and when to process using python > >> code. > > >> Thanks! > > >> johnP > > >> -- > >> You received this message because you are subscribed to the Google Groups > >> "Google App Engine" group. > >> To post to this group, send email to [email protected]. > >> To unsubscribe from this group, send email to > >> [email protected]. > >> For more options, visit this group at > >>http://groups.google.com/group/google-appengine?hl=en. > > > -- > > Stay hungry,Stay foolish. > > > -- > > You received this message because you are subscribed to the Google Groups > > "Google App Engine" group. > > To post to this group, send email to [email protected]. > > To unsubscribe from this group, send email to > > [email protected]. > > For more options, visit this group at > >http://groups.google.com/group/google-appengine?hl=en. -- You received this message because you are subscribed to the Google Groups "Google App Engine" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
