用20000个字符串填充Google App Engine应用的datastore
我正在尝试在本地数据存储中创建并保存20000个随机代码,然后再在appspot上试试。这是我的模型:
class PromotionCode (db.Model):
code = db.StringProperty(required=True)
这是处理填充请求的类(只有登录的管理员可以使用)。它会生成随机的字母数字代码,并尝试将20000个代码存储到数据存储中:
class Populate(webapp.RequestHandler):
def GenerateCode(self):
chars = string.letters + string.digits
code = ""
for i in range(8):
code = code + choice(chars)
return code.upper()
def get(self):
codes = "";
code_list = []
for i in range(20000):
new_code = self.GenerateCode()
promotion_code = PromotionCode(code=new_code)
code_list.append(promotion_code)
codes = codes + "<br>" + new_code
db.put(code_list)
self.response.out.write("populating datastore...<br>")
self.response.out.write(codes)
我想我可以把所有的put()操作批量处理,所以我创建了一个代码列表(code_list)。在本地执行这个操作需要2到5分钟。
有没有可能在不使用批量上传选项的情况下更快地完成这个?因为我明显遇到了500服务器错误。或者也许可以分步骤连续调用……
4 个回答
0
你可以在任务队列中进行批处理。
把任务队列的批处理大小设置得大一些...
这样可以让你完成任务的速度更快。
0
我不明白为什么你需要提前创建20,000个,而不是根据需要随时创建。不过,我敢打赌这样做可以让你的代码运行得更快。可以试试下面这个(没测试过):
class Populate(webapp.RequestHandler):
chars = "AB...Z01...9"
def GenerateCode(self):
return ''.join(choice(chars) for _ in xrange(8))
def get(self):
code_list = []
for i in range(20000):
new_code = self.GenerateCode()
promotion_code = PromotionCode(code=new_code)
code_list.append(promotion_code)
db.put(code_list)
self.response.out.write("populating datastore...<br>")
self.response.out.write("done")
不打印出这些代码可能会节省时间。
我相信这里还有其他人能做得更好……
1
为什么不把你的代码改成一次插入100个,然后在命令行里运行类似下面的代码呢:
for i in {1..200}
do
curl --cookie "ACSID=your-acsid-cookie" http://your-app-id.appspot.com/populatepath
sleep(5)
done
反正这些条目都是随机的,你也不需要记住任何状态。
你可以通过手动登录,然后在浏览器里查看cookies来获取ACSID这个cookie。
在请求之间加点延迟,可以防止你一下子创建太多实例或者超出短期的使用限制。
如果你需要自动化这个过程,使用任务队列的建议是不错的,但如果只是一次性的操作,保持简单就好。