2009-07-10 56 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