2009-07-10 57 views
0

我正在寫一個小程序來記錄閱讀進度,數據模型很簡單:數據存儲訪問優化

class BookState(db.Model): 
    isbn = db.StringProperty() 
    title = db.StringProperty(required=True) 
    pages = db.IntegerProperty(required=True) 
    img = db.StringProperty() 

class UpdatePoint(db.Model): 
    book = db.ReferenceProperty(BookState) 
    date = db.DateProperty(required=True) 
    page = db.IntegerProperty(required=True) 

的UpdatePoint類記錄的用戶有多少網頁上的相應日期讀取。現在我想提請從存儲在App Engine的數據庫中的數據的圖表,函數看起來是這樣的:

book = db.get(bookkey) 
ups = book.updatepoint_set 
ups.order('date') 

for (i, up) in enumerate(ups): 
    if i == 0: continue 

    # code begin 
    days = (up.date - ups[i-1].date).days 
    pages = up.page - ups[i-1].page 
    # code end 

    # blah blah 

我發現了一本書,大約40更新點,它會成本超過4秒鐘運行代碼。在計時之後,我發現評論的代碼片段似乎是糟糕的表現的根源。每個循環的成本大約爲0.08秒或更多。

看起來UpdatePoint是以一種懶惰的方式提取的,它不會被加載直到它被需要。我想知道是否有任何更好的解決方案來加速數據訪問,如提取大量數據。

非常感謝您的回覆。

回答

3

看來我錯誤地使用了Query類。我需要首先調用ups.fetch()來獲取數據。現在代碼是很多比以前快:

book = db.get(bookkey) 
q = book.updatepoint_set 
q.order('date') 
ups = q.fetch(50) 
+0

我認爲這就是你的updatepoint_set函數可能會做的,因爲這不是我見過的appengine調用。 – AutomatedTester 2009-07-10 07:46:15

0

從代碼上來看,似乎你放慢是因爲它在循環,必須還挺蹦出找到你想要的對象。你有沒有嘗試類似

i = 0 
for up in ups: 
    if i != 0: 
    days = (up.date - previous.date).days 
    pages = up.page - previous.page 
    i += 1 
    previous = up