Google App Engine пишет мучительно медленно - как исправить - PullRequest
1 голос
/ 21 января 2012

У меня есть несколько довольно простых моделей, которые мне нужно оптимизировать, так как мои записи в механизм приложений с использованием 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 секунд, это нормально?Как я могу оптимизировать это, чтобы быть более эффективным

Ответы [ 2 ]

1 голос
/ 22 января 2012

Проблема с моделью данных, которую вы предложили здесь.У вас не может быть большого числа ключей на одной стороне отношений, как описано в этой статье - http://code.google.com/appengine/articles/modeling.html

Кроме того, цикл for в вашем сегменте кода для вставки записи библиотеки также вставляет всеАвторы и книги последовательно.Если предположить, что для каждого хранилища данных установлено около 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 голосов
/ 22 января 2012

В дополнение к ответу Мани, ваш код в настоящее время создает автора для каждой книги.В хранилище данных, как правило, лучше создать одну большую сущность, а не множество мелких, поэтому вы можете попытаться встроить авторов в сущности книги (например, путем непосредственного сохранения имени автора в книге) и сохранить хранение двух независимых сущностей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...