删除所有blobstore数据的最简单方法是什么?

时间:2011-09-08 09:28:27

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

从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和(据我所知)做的 没什么用的。

2 个答案:

答案 0 :(得分:7)

我使用这种方法:

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)),但我认为现在有一个bug。什么都没发生,什么都没有删除。

答案 1 :(得分:4)

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

此外,调用count执行查询只是为了确定计数,这是浪费时间,因为你还是要尝试获取结果。

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