2012-01-21 78 views
1

我有一些非常簡單的模型,我需要優化,因爲我使用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() 

這通常需要8到20秒插入1庫,這是正常的嗎?我如何優化這個以提高效率

+2

你的批次是否放入? – Cameron

+0

會嘗試 - 謝謝 –

回答

1

問題在於你在這裏提出的數據模型。如本文所述,您不能在關係的一側擁有大量的密鑰列表 - http://code.google.com/appengine/articles/modeling.html

另外,插入庫記錄的代碼段中的for循環也會按順序插入所有作者和書籍。假設每個數據存儲放置()大約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的輸入每個書,但ATLEAST可以獨立和參考書籍進入到圖書館,它已經被創建。

0

添加到Mani的答案中,您的代碼當前爲每本書創建一個作者。在數據存儲中,通常最好創建一個大型實體,而不是多個小型實體,因此您可以嘗試將作者內嵌到書實體中(例如,通過直接在書中存儲author_name)並保存兩個獨立的實體。