我有一些非常简单的模型,我需要优化,因为我使用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秒,这是正常的吗?如何优化它以提高效率
答案 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)并保存存储两个独立实体。