Перенос схемы в хранилище данных GAE

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

Я запускаю большое приложение на Google App Engine и добавляю новые функции, которые вынуждают меня изменять старые классы данных и добавить новые. Чтобы очистить нашу базу данных и обновить старые записи, я пытался написать сценарий, который может перебирать экземпляры класса, вносить изменения и затем повторно сохранять их. Проблема в том, что Google App Engine прерывает время ожидания, когда вы выполняете вызовы на сервер, которые занимают больше нескольких секунд.

Я боролся с этой проблемой в течение нескольких недель. Лучшее решение, которое я нашел, здесь: http://code.google.com/p/rietveld/source/browse/trunk/update_entities.py?spec=svn427&r=427

Я создал версию этого кода для моего собственного веб-сайта, который вы можете увидеть здесь:

def schema_migration (self, target, batch_size=1000):
    last_key = None
    calls = {"Affiliate": Affiliate, "IPN": IPN, "Mail": Mail, "Payment": Payment, "Promotion": Promotion}

    while True:
        q = calls[target].all()
        if last_key:
            q.filter('__key__ >', last_key)
        q.order('__key__')
        this_batch_size = batch_size

        while True:
            try:
                batch = q.fetch(this_batch_size)
                break
            except (db.Timeout, DeadlineExceededError):
                logging.warn("Query timed out, retrying")
                if this_batch_size == 1:
                    logging.critical("Unable to update entities, aborting")
                    return
                this_batch_size //= 2

        if not batch:
            break

        keys = None
        while not keys:
            try:
                keys = db.put(batch)
            except db.Timeout:
                logging.warn("Put timed out, retrying")

        last_key = keys[-1]
        print "Updated %d records" % (len(keys),)

Как ни странно, код отлично работает для классов, содержащих от 100 до 1000 экземпляров, а сценарий часто занимает около 10 секунд. Но когда я пытаюсь запустить код для классов в нашей базе данных с более чем 100 КБ экземпляров, сценарий выполняется в течение 30 секунд, а затем я получаю следующее:

«Ошибка: ошибка сервера

Сервер обнаружил ошибку и мог не завершить ваш запрос. Если проблема не исчезнет, ​​сообщите о ней и укажите это сообщение об ошибке и запрос, который ее вызвал. ""

Есть идеи, почему GAE отключается ровно через тридцать секунд? Что я могу сделать, чтобы обойти эту проблему?

Спасибо! Keller

6
задан Calvin 28 February 2011 в 01:03
поделиться