Google App Engine编写速度极慢-如何修复

问题描述 投票:1回答:2

我有一些非常简单的模型需要优化,因为我使用python对应用程序引擎的写入非常缓慢。 这是我的模型(示例不实际)

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秒,这正常吗? 我如何优化它以提高效率

google-app-engine models
2个回答
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毫秒,但是您至少可以独立输入图书并引用已经创建的图书馆。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.