2011-09-08 74 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

相關問題