Google App Engine写得很慢 - 如何修复

时间:2012-01-21 15:06:45

标签: google-app-engine models

我有一些非常简单的模型,我需要优化,因为我使用python写入app引擎的速度非常慢。这是我的模型(例子不是实际的)

class Library(db.Model):
    name = db.StringProperty()
    books = db.ListProperty(db.Key) #usually between 20 - 200 items

class Book(db.Model):
    author = db.ReferenceProperty(Author)

class Author(db.Model):
    name = db.StringProperty()

def add_library(books):
    library = Library(name="bob's")

    for book in books:
        lbook = Book() 
        author = Author(name="tom")
        author.put()
        lbook.author = author
        lbook.put()
        library.books.append(lbook)
    library.put()

插入1个图书馆通常需要8到20秒,这是正常的吗?如何优化它以提高效率

2 个答案:

答案 0 :(得分:1)

问题在于您在此处提出的数据模型。您不能在关系的一侧拥有大量密钥列表,如本文所述 - http://code.google.com/appengine/articles/modeling.html

此外,用于插入库记录的代码段中的for循环也会按顺序插入所有作者和书籍。假设每个数据存储区put()约40毫秒,假设你有50本书和50位作者,则需要4秒,很长一段时间!最后创建了你的图书馆记录。

您可以按照以下方式定义模型,而不是在图书馆方面拥有图书清单:

class Library(db.Model):
    name = db.StringProperty()

class Book(db.Model):
    author = db.ReferenceProperty(Author)
    library = db.ReferenceProperty(Library, collection_name = 'books')

在这种情况下,您的图书会定义它所属的图书馆。您可以只创建一次库,并引用所有书籍。当你想要书籍时,你可以做

for book in my_library.books:
    // Do something with books

输入每本书仍然需要40毫秒,但至少你可以独立输入书籍并参考已经创建的图书馆。

答案 1 :(得分:0)

根据Mani的回答,您的代码目前为每本书创建了一个作者。在数据存储区中,通常最好创建一个大型实体而不是很多小型实体,因此您可以尝试将作者内联到书籍实体中(例如,通过直接在书中存储author_name)并保存存储两个独立实体。