我有一些非常简单的模型需要优化,因为我使用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秒,这正常吗? 我如何优化它以提高效率
问题在于您在此处提出的数据模型。 如本文所述-您不能在关系的一侧拥有大量的键列表-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毫秒,但是您至少可以独立输入图书并引用已经创建的图书馆。
除了Mani的答案外,您的代码当前还为每本书创建了一个作者。 在数据存储区中,通常最好创建一个大型实体,而不是创建许多小型实体,因此您可以尝试将作者内联到书籍实体中(例如,通过直接在书籍中存储author_name),并保存两个独立的实体。