2011-09-01 68 views
0

爲什麼此代碼需要0.32個CPU小時,並且具有24.6 MBytes的avreage內存? 頁面刷新大約30次,直到停止爲止,因爲不再有數據存儲實體。爲什麼此代碼如此CPU和內存密集?

class MainHandler(webapp.RequestHandler): 
    def get(self): 
     found = False 
     q = MyModel.all(keys_only=True).fetch(1000) 
     if len(q): 
      self.response.out.write("Deleted %d MyModel entries" % len(q)) 
      found = True 
      db.delete(q) 

     q = MyModel2.all(keys_only=True).fetch(1000) 
     if len(q): 
      self.response.out.write("Deleted %d MoModel2 entries" % len(q)) 
      found = True 
      db.delete(q) 

     if found: 
      self.response.out.write('<meta http-equiv="Refresh" content="0"/>') 
def main(): 
    application = webapp.WSGIApplication([('/', MainHandler)], debug=True) 
    util.run_wsgi_app(application) 

if __name__ == '__main__': 
    main() 

有什麼我可以做的,以加快它,並使用更少的內存?

謝謝

+1

我不熟悉您使用的是'webapp'包,但你的WSGIApplication會是'MainHandler'而這裏顯示的代碼'ResetHandler'。他們是一樣的嗎? –

+2

這是你幾乎可以肯定想要使用taskqueue鏈接而不是在Web瀏覽器中刷新的事情,但是,在App Engine中刪除是CPU密集型的。 – geoffspear

+0

同意Wooble。另外,如果這不是預定的事情,而是手動調用的東西,則可以使用Datastore Admin刪除某種實體。 (只是一個指針,並不是說它在CPU時間方面會更便宜) –

回答

0

我發現通過測試,我可以由3倍降低CPU使用率僅通過一次讀取200個條目:

q = MyModel.all(keys_only=True) 
for i in xrange(0, 1000, 200): 
    db.delete(q.fetch(200)) 

擷取100個結果在時間實際上比一次讀取200慢。 但我會檢查到映射精簡,但我不認爲這是一個事

+0

我非常懷疑這會降低總CPU使用率 - 您仍在提取和刪除相同數量的實體。你有沒有試過在其上運行appstats? –

0

借調任務隊列。使用mapreduce來刪除實體是一種常見的做法。它會爲你管理任務。

一個微型優化是使一個webapp.WSGIApplication和從類變量中重用它,而不是每次調用main()時創建一個新的。