2011-09-08 82 views
4

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

我有相当多的斑点,我想删除它们。我 目前做如下:

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吨和(据我可以告诉)做 没什么用处。

回答

4

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

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

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

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个斑点一次会失败,所以我让它重新加载每400我试过blobstore.delete(query.fetch(400)),但我觉得有一个错误,现在。什么都没发生,没有被删除。

+0

为我工作。一些注释:1 /输出只有在页面结束加载后才可见,在我的情况下,这只发生在最后一次重定向(最后400个查询)结束时。 2 /我仍然有几个http 500错误,所以我只是重新加载页面,只要它,它会继续删除blob。 –

+0

在迭代blob之前,您不需要检查'len(blob)> 0'。在Python中,尝试遍历空集合是安全的。 –

+0

如果它的无,你会只有问题,因为@Attila提到它可以安全地迭代空集合。尽管在任何情况下你都可以通过'blob:'来保证安全,因为python会返回false为0,空集合或None。 – topless

相关问题