【问题标题】:What is the easiest way of deleting all my blobstore data?删除所有 blobstore 数据的最简单方法是什么?
【发布时间】:2011-11-12 20:07:42
【问题描述】:

从 blobstore 中删除所有 blob 的最佳方法是什么?我正在使用 Python。

我有很多 blob,我想将它们全部删除。我是 目前正在做以下事情:

class deleteBlobs(webapp.RequestHandler): 
    def get(self): 
        all = blobstore.BlobInfo.all(); 
        more = (all.count()>0) 
        blobstore.delete(all); 
        if more: 
            taskqueue.add(url='/deleteBlobs',method='GET'); 

这似乎使用了大量的 CPU 并且(据我所知)正在做 没什么用。

【问题讨论】:

    标签: python google-app-engine blobstore task-queue


    【解决方案1】:

    您将查询对象传递给 delete 方法,该方法将对其进行迭代以批量获取它,然后提交一个巨大的删除。这是低效的,因为它需要多次提取,并且如果您的结果多于在可用时间或可用内存中提取的结果,则将无法工作。该任务将完成一次并且根本不需要链接,或者更有可能重复失败,因为它不能一次获取每个 blob。

    另外,调用count 执行查询只是为了确定计数,这是浪费时间,因为无论如何您都要尝试获取结果。

    相反,您应该使用fetch 批量获取结果,并删除每个批次。使用游标设置下一个批次,避免查询在找到第一个活动记录之前遍历所有“墓碑”记录,理想情况下,每个任务删除多个批次,使用计时器来确定何时应该停止和链接下一个任务。

    【讨论】:

      【解决方案2】:

      我使用这种方法:

      import datetime
      import logging
      import re
      import urllib
      
      from google.appengine.ext import blobstore
      from google.appengine.ext import db
      from google.appengine.ext import webapp
      
      from google.appengine.ext.webapp import blobstore_handlers
      from google.appengine.ext.webapp import util
      from google.appengine.ext.webapp import template
      
      from google.appengine.api import taskqueue
      from google.appengine.api import users
      
      
      class IndexHandler(webapp.RequestHandler):
          def get(self):
              self.response.headers['Content-Type'] = 'text/plain'
              self.response.out.write('Hello. Blobstore is being purged.\n\n')
              try:
                  query = blobstore.BlobInfo.all()
      
                  index = 0
      
                  to_delete = []
                  blobs = query.fetch(400)
                  if len(blobs) > 0:
                      for blob in blobs:
                          blob.delete()
                          index += 1
      
                  hour = datetime.datetime.now().time().hour
                  minute = datetime.datetime.now().time().minute
                  second = datetime.datetime.now().time().second
                  self.response.out.write(str(index) + ' items deleted at ' + str(hour) + ':' + str(minute) + ':' + str(second))
                  if index == 400:
                      self.redirect("/purge")
      
              except Exception, e:
                  self.response.out.write('Error is: ' + repr(e) + '\n')
                  pass
      
      APP = webapp.WSGIApplication(
          [
              ('/purge', IndexHandler),
          ],
          debug=True)
      
      def main():
          util.run_wsgi_app(APP)
      
      
      if __name__ == '__main__':
          main()
      

      我的经验是一次超过 400 个 blob 会失败,所以我让它每 400 个重新加载一次。我尝试了blobstore.delete(query.fetch(400)),但我认为现在有一个错误。什么都没有发生,也没有被删除。

      【讨论】:

      • 为我工作。几点说明: 1/ 输出仅在页面结束加载后可见,在我的情况下,这只发生在最后一次重定向(最后 400 次查询)结束时。 2/ 我仍然有几个 http 500 错误,所以我只要重新加载页面,它就会继续删除 blob。
      • 在迭代 blob 之前,您无需检查 if len(blobs) > 0。在 Python 中,尝试遍历空集合是安全的。
      • 只有在没有问题的情况下才会有问题,正如@Attila 提到的那样,它可以安全地迭代空集合。在任何情况下,您都可以通过if blobs: 确保安全,因为 python 将返回 false 为 0、空集合或 None。
      猜你喜欢
      • 2012-06-30
      • 1970-01-01
      • 1970-01-01
      • 2011-04-02
      • 2021-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多