我正在尝试在我的本地数据存储区中创建和存储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分钟。
是否可以在不使用bulkuploader选项的情况下更快地完成?因为我明显得到500服务器错误。或者也许是在连续的电话或步骤中进行...
答案 0 :(得分:1)
为什么不将上面的代码更改为一次插入100,并运行类似:
for i in {1..200}
do
curl --cookie "ACSID=your-acsid-cookie" http://your-app-id.appspot.com/populatepath
sleep(5)
done
从你的命令行?无论如何,条目是随机的,您不需要记住任何状态。
您可以通过手动登录并从浏览器检查Cookie来获取ACSID cookie。
请求之间的休眠将阻止您激活大量实例或达到短期配额。
任务队列建议是好的,如果这是你需要自动化的东西,但如果这是一次性的事情你也可以保持简单。
答案 1 :(得分:0)
您可以在任务队列中对进程进行批处理。
将批量大小设置为任务队列...
你可以更快地存档它
答案 2 :(得分:0)
我不明白为什么你必须提前创建20,000而不是动态创建每个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")
不打印代码可以节省时间。
我相信这里的其他人可以做得更好......
答案 3 :(得分:0)
如果您的任务无法在30秒的请求截止日期内完成,您可以将其分解为块 - 这应该很容易,因为它们都在做同样的事情 - 并在任务队列中的任务中运行它们。你应该在那里做你所有的工作,所以你不要强迫用户在返回响应之前等待它完成。
就像杰夫一样,我很困惑为什么你想要预先产生20,000个,而不是只在你需要的时候生成它们。