用20000个字符串填充Google App Engine应用的datastore

0 投票
4 回答
755 浏览
提问于 2025-04-17 04:41

我正在尝试在本地数据存储中创建并保存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。

在请求之间加点延迟,可以防止你一下子创建太多实例或者超出短期的使用限制。

如果你需要自动化这个过程,使用任务队列的建议是不错的,但如果只是一次性的操作,保持简单就好。

撰写回答