2

小手術我AppEngine上使用python 27.我寫了下面的方法從匹配特定的「冒險」的數據存儲檢索圖像細節組建一個基本的畫冊。我使用限制和偏移量進行分頁,但效率很低。瀏覽5頁(每頁5張照片)後,我已經使用了我的數據存儲小操作的16%。有趣的是,我只用了1%的數據存儲讀取操作。如何讓數據存儲小型操作更高效 - 我不確定這些操作是由什麼組成的。使用更少的數據存儲在AppEngine上

def grab_images(adventure, the_offset=0, the_limit = 10): 
    logging.info("grab_images") 
    the_photos = None 
    the_photos = PhotosModel.all().filter("adventure =", adventure) 
    total_number_of_photos = the_photos.count() 
    all_photos = the_photos.fetch(limit = the_limit, offset = the_offset) 
    total_number_of_pages = total_number_of_photos/the_limit 
    all_photo_keys = [] 
    for photo in all_photos: 
     all_photo_keys.append(str(photo.blob_key.key())) 
    return all_photo_keys, total_number_of_photos, total_number_of_pages 

回答

6

有幾件事情:

  1. 你並不需要有計數每次調用,您可以緩存它
  2. 同去查詢,你爲什麼要查詢所有的時間?緩存它也。
  3. 緩存的頁面也,你不應該每次時間計算器每頁的數據。
  4. 您只需要blob_key,但是您正在加載整個照片實體,請嘗試使用不需要加載所有照片屬性的方式對其進行建模。

挑剔:你不需要the_photos =無

+1

我已經更好地使用緩存並更改了PhotosModel,使blob_key是實際的鍵(字符串)而不是ReferenceProperty。僅此一項就大大減少了小數據存儲查詢的數量 – user714852 2012-02-15 18:28:14

+0

@ user714852酷! – 2012-02-15 18:45:23

1

您處理分頁是低效的,因爲它經過的每個記錄前偏移傳遞數據的方式。您應該考慮使用Google http://code.google.com/appengine/articles/paging.html所述的書籤方法構建分頁機制。

使用此方法,您只需瀏覽每個頁面所需的項目。我也敦促你按照Shay的建議正確緩存,它既快又便宜。

0

您可能需要考慮轉向新的NDB API。它對期貨,緩存和自動錶達的使用可能會幫助你很多。顯式優於隱式,但NDB對細節的管理使您的代碼更簡單,更易讀。

順便說一句,你有沒有嘗試使用Appstats會看到你的請求是如何使用服務器資源?

+0

我已經簡要了解了NDB API,並且被各個大測試版標誌嚇到了一點。我已經使用python27這還不是確切的生產做好準備,我想我的應用程序是稍顯不足的風險,如果我只使用一個測試版產品在同一時間... – user714852 2012-02-20 07:48:29

+0

好一點。我有一個麻煩,移動一個應用程序2.7自己顯然沒有很好的理由(對於麻煩,而不是遷移)的一個公平的份額: -/ 而且我同意2.7開始是明智的 - 很明顯2.7是未來目前。 – rbanffy 2012-02-21 14:10:50

相關問題