通过Google App Engine后端批量下载

时间:2013-05-03 15:44:34

标签: google-app-engine google-cloud-datastore bulkloader

我想在Google App Engine应用中下载160万个实体。我尝试使用内置的bulkloader机制,但发现它非常慢。虽然我只能通过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%的实体。即使没有遍历完整的实体集,我也会收到空数据的响应。为什么这种方法不能全面获取所有内容?

1 个答案:

答案 0 :(得分:2)

我在文档中找不到任何要确认或否认的内容,但我的猜测是all()有一个非确定性的排序,这样最终你的一个fetch(1000)会命中“最后一个元素”和devices.cursor()将不返回任何内容。

试试这个:

devices = Pushdev.all().order('__key__')