If the number of entities in the kind is reasonably small, you could
do:

keys = Kind.all(keys_only=True).fetch(MAX_ENTITIES)

Pick x keys out of that list, and then use db.get() to fetch them.

Otherwise, johnP's suggestion is probably best, but I don't see why
you need the extra overhead of pickling/unpickling the list.  Just
store the keys in a ListProperty(indexed=False).

On Jul 14, 1:07 pm, Bennomatic <readyass...@gmail.com> wrote:
> I was just thinking this last night when I wasn't at my computer.
> Darn you for publishing my good idea first! :)
>
> It doesn't bring the number of queries down to 1, but it does bring
> them down to 2, at least on the request side.
>
> Of course, it also means one extra transactions every time a new
> entity is created, so I don't know if there's any net savings, but
> this does seem like a reasonable way to address the issue at hand.
>
> -Ben
>
> On Jul 12, 11:08 pm, johnP <j...@thinkwave.com> wrote:
>
> > > Dont know quite how would implement a fifo buffer on AppEngine, would
> > > almost certainly use the datastore, so is going to be expensive...
>
> > A possibility is to maintain an index, which is a pickled list of
> > entity keys, stored as a blob somewhere.  You'll need to maintain the
> > index by adding/removing keys as you add/remove entities.  But then,
> > when you need to make a random choice, just unpickle the list, grab
> > any five keys from the list, and db.get([keys]).
>
> > johnP
>
> > On Jul 11, 12:41 pm, Barry Hunter <barrybhun...@googlemail.com> wrote:
>
> > > On 11/07/2009, Devel63 <danstic...@gmail.com> wrote:
>
> > > >  Barry, I understand your objections below, but do you have a better
> > > >  approach?
>
> > > no, I dont. The way in my first reply is the best I can think off. Not
> > > totally uniform, but dont think any 'random' solution is going to be,
> > > unless you keep the data uptodate - which is not practical on
> > > AppEngine.
>
> > > A reasonably good solution, is to use a FIFO buffer, when the queue is
> > > empty you get all keys, and shuffle them and add to the queue. then
> > > getting random results is a matter of poping that many keys off the
> > > queue, and fetching them.
>
> > > Dont know quite how would implement a fifo buffer on AppEngine, would
> > > almost certainly use the datastore, so is going to be expensive.
>
> > > >  Assigning random numbers to entities is guaranteed to be worse.  If
> > > >  you are worried about an entity being deleted and opening a gap in the
> > > >  sequence, imagine the thousand-fold gaps you will see with random ID
> > > >  generation (e.g. 1, 10001, 10002, 20000, ...).
>
> > > >  See below.
>
> > > >  On Jul 10, 3:03 pm, Barry Hunter <barrybhun...@googlemail.com> wrote:
>
> > > > > On 10/07/2009, Devel63 <danstic...@gmail.com> wrote:
>
> > > >  > >  The best way is to assign a one-up counter to each record as you
> > > >  > >  create it, then call random.randint(1,max_counter) to determine 
> > > > the
> > > >  > >  desired record.
>
> > > >  > >  To retrieve multiple random entities in a query, do a filter('IN 
> > > > ',
> > > >  > >  [my random nums]).
>
> > > >  > doent work that well once records start getting deleted (get the same
> > > >  > issue, non uniform distribution)
>
> > > > If an app needs to support entity deletion, you can still ensure
> > > >  uniformity by running a periodic cron job to compress the counter
> > > >  sequence.
>
> > > >  > nor does it work if you filtering at the same time :(
>
> > > > Correct, in that the distribution is no longer uniform.  But this is
> > > >  also true of the random ID approach. I admit that the random ID
> > > >  approach seems appealing at first, but when you actually look into it,
> > > >  you'll find that you are guaranteed that many results will be 3X more
> > > >  likely than others, or worse.  It IS better in the case that you want
> > > >  to randomize based on time of entity creation, but there are other
> > > >  ways to deal with this.
>
> > > >  I would love it if someone could come up with a good way to do true
> > > >  random results of an arbitrary query set!!
>
> > > >  > >  Note that behind the scenes this generates multiple queries, so 
> > > > you're
> > > >  > >  not saving much time.
>
> > > >  > >  On Jul 10, 7:34 am, Wooble <geoffsp...@gmail.com> wrote:
> > > >  > >  > Highly non-optimal solution: have a cron job assign new random 
> > > > numbers
> > > >  > >  > to your entities often enough to simulate randomness.  Even 
> > > > just re-
> > > >  > >  > assigning numbers to entities that have been previously 
> > > > selected might
> > > >  > >  > work.  This involves a lot more CPU as you'd be doing writes, 
> > > > but
> > > >  > >  > shifts the work from request time to a background process so 
> > > > your
> > > >  > >  > users don't see the added latency for doing N queries.
>
> > > >  > >  > Another possible solution would be to fetch keys only for X*N 
> > > > entities
> > > >  > >  > (where greater X's produce more apparent randomness) then 
> > > > choose N of
> > > >  > >  > those keys to actually fetch entities.
>
> > > >  > >  > On Jul 9, 12:33 pm, aloo <aleem.maw...@gmail.com> wrote:
>
> > > >  > >  > > Hi all,
>
> > > >  > >  > > I'm trying to write a GQL query that returns N random records 
> > > > of a
> > > >  > >  > > specific kind. My current implementation works but requires N 
> > > > calls to
> > > >  > >  > > the datastore. I'd like to make it 1 call to the datastore if
> > > >  > >  > > possible.
>
> > > >  > >  > > I currently assign a random number to every kind that I put 
> > > > into the
> > > >  > >  > > datastore. When I query for a random record I generate 
> > > > another random
> > > >  > >  > > number and query for records > rand ORDER BY asc LIMIT 1.
>
> > > >  > >  > > This works, however, it only returns 1 record so I need to do 
> > > > N
> > > >  > >  > > queries. Any ideas on how to make this one query? Thanks.
>
> > > --
> > > Barry
>
> > > -www.nearby.org.uk-www.geograph.org.uk-
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Google App Engine" group.
To post to this group, send email to google-appengine@googlegroups.com
To unsubscribe from this group, send email to 
google-appengine+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/google-appengine?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to