私はちょうど同じ問題を抱えていました。データストア内の既存のエントリにIDを割り当てないように決めました。これは、すでにシャードカウンターからの総計があるためです。
キーでソートされた「totalcount」エントリから「count」エントリを選択します。
# select $count from the complete set
numberlist = random.sample(range(0,totalcount),count)
numberlist.sort()
pagesize=1000
#initbuckets
buckets = [ [] for i in xrange(int(max(numberlist)/pagesize)+1) ]
for k in numberlist:
thisb = int(k/pagesize)
buckets[thisb].append(k-(thisb*pagesize))
logging.debug("Numbers: %s. Buckets %s",numberlist,buckets)
#page through results.
result = []
baseq = db.Query(MyEntries,keys_only=True).order("__key__")
for b,l in enumerate(buckets):
if len(l) > 0:
result += [ wq.fetch(limit=1,offset=e)[0] for e in l ]
if b < len(buckets)-1: # not the last bucket
lastkey = wq.fetch(1,pagesize-1)[0]
wq = baseq.filter("__key__ >",lastkey)
は私にとって、これはやや複雑であることに注意してください、と私はまだ私がずつオフまたはオフによって-Xのエラーを持っていけないことconvicedありませんよ。
カウントがtotalcountに近い場合、これは非常に高価になる可能性があることに注意してください。 そして、数百万行の行では、appengineの時間境界内では実行できない可能性があることに注意してください。
は、私はあなたがそれを固定し得るのを助けるためにそれを主演することができ、このために問題を作成しました: https://code.google.com/p/googleappengine/issues/detail?id=9044 –