2

我想下载的 Google App Engine 应用中有 160 万个实体。我尝试使用内置的bulkloader机制,但发现它非常慢。虽然我只能通过批量加载器每秒下载约 30 个实体,但通过后端查询数据存储区,我可以每秒下载约 500 个实体。需要一个后端来规避 60 秒的请求限制。此外,数据存储区查询最多只能存在 30 秒,因此您需要使用查询游标在多个查询中拆分提取。

服务器端的代码获取 1000 个实体并返回一个查询游标:

cursor = request.get('cursor')
devices = Pushdev.all()

if (cursor and cursor!=''):
    devices.with_cursor(cursor)

next1000 = devices.fetch(1000)

for d in next1000:
    t = int(time.mktime(d.created.timetuple()))
    response.out.write('%s/%s/%d\n'%(d.name,d.alias,t))

response.out.write(devices.cursor())

在客户端,我有一个循环调用服务器上的处理程序,并以空游标开头,然后开始传递上一次调用收到的游标。它在得到空结果时终止。

问题:我只能使用此方法获取一小部分 - 约 20% 的实体。即使尚未遍历完整的实体集,我也会收到空数据的响应。为什么这种方法不能全面获取所有内容?

4

1 回答 1

2

我在文档中找不到任何可以证实或否认这一点的东西,但我的猜测是它all()具有不确定的顺序,因此最终你的一个fetch(1000)' 将命中“最后一个元素”并且devices.cursor()不会返回任何内容。

尝试这个:

devices = Pushdev.all().order('__key__')
于 2013-05-17T00:14:14.720 回答