2012-01-21 11 views
1

私はPythonを使用してアプリケーションエンジンへの書き込みに苦労して遅いので、私が最適化する必要があるかなり単純なモデルがあります。ここに私のモデル(例ではありませんが、実際の)あるGoogle App Engineは苦労して書き込みが遅い - 修正方法

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

パットをバッチに入れますか? – Cameron

+0

はお試しになります - ありがとう –

答えて

1

問題はここで提案したデータモデルにあります。この記事で説明しているように、関係の片側に多数のキーのリストを持つことはできません - http://code.google.com/appengine/articles/modeling.html

また、ライブラリレコードを挿入するためのコードセグメントのfor-loopもすべての著者と書籍を順番に挿入します。 put()のデータストアごとに約40msと仮定し、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 

を行うことができますそれはまだ各書籍に入るためには40msかかりますが、少なくともあなたは独立して本を入力して、すでに作成されているライブラリを参照することができます。

0

Maniの回答に加えて、あなたのコードは現在、各書籍の著者を作成しています。データストアでは、多くの小さなエンティティではなく1つの大きなエンティティを作成する方が一般的です。そのため、著者を書籍のエンティティにインライン化することができます(たとえばauthor_nameをブックに直接格納するなど)。

関連する問題