Плохая производительность хранилища данных в Google App Engine, в то время как у ввода данных больше свойств - PullRequest
0 голосов
/ 20 октября 2011

Версия1

class ActionLog(db.Model):
    action = db.StringProperty()
    time_slice = db.IntegerProperty()
    trace_code = db.StringProperty()    # which profile this log belong to

    # Who
    facebook_id = db.StringProperty()   # the user's facebook id
    ip = db.StringProperty()            # the user's ip address

    # When
    time = db.DateTimeProperty(auto_now_add=True)   # the time of this event

    # What
    url = db.StringProperty()           # the imgurl
    secret = db.StringProperty()        # the secret of imgurl instance
    tag = db.StringProperty()           # the tag
    referurl = db.StringProperty()      # the tag's link

    # Where
    weburl = db.StringProperty()        # the user's refer url
    domain = db.StringProperty()        # the refer url's domain
    BSP = db.StringProperty()           # the refer url's BSP

#execute
log = ActionLog(action=action,
        trace_code=trace_code,
        facebook_id=facebook_id,
        ip=ip,
        time_slice=time_slice,
        url=url,
        secret=secret,
        tag=tag,
        referurl=referurl,
        weburl=weburl,
        domain=domain,
        BSP=BSP)

db.put(log)

Версия 2

class ActionLog(db.Model):
    trace_code = db.StringProperty()
    url = db.StringProperty()
    secret = db.StringProperty()

    # use a dict like text property to store all implicit properties.
    desp = MyDictProperty() 
    time = db.DateTimeProperty(auto_now_add=True)   # the time of this event

#execute
log = ActionLog(
                    secret = secret,
                    url = url,
                    trace_code = trace_code,
                    desp = {
                            'action':action,
                            'facebook_id':facebook_id,
                            'ip':ip,
                            'tag':tag,
                            'referurl':referurl,
                            'weburl':weburl,                            
                            }
                    )

db.put(log)

Эти две версии кода в основном выполняют одну и ту же задачу, однако код версии 1 будет использовать более 800 мсек для выполнения простоговключите операцию (желтый или красный свет) процессорного времени на Google App Engine.В контракте код версии 2 использует только около 300 мс.(Оба теста в хранилище данных HRD)

В хранилище данных M / S код версии 1 будет использовать около 400 мс, а код версии 2 - около 150 мс.

Я могу представить, что версия 1 будетбыть медленнее по сравнению с версией 2, так как он использует больше индекса ключа.Однако трудно поверить, что разница такая огромная.Также удивительно, что движок приложений Google не может справиться с такой простой задачей.

Означает ли это, что мы не можем ожидать, что GAE выполнит вставку данных с более чем 10 свойствами, или я что-то неправильно понимаю?

thx

Ответы [ 2 ]

1 голос
/ 25 октября 2011

Ваша первая модель имеет 13 индексированных свойств, а вторая - только 5. Не удивительно, что первая занимает больше времени - вы можете уменьшить ее, установив свойства как неиндексированные, как предлагает Дейв.

Означает ли это, что мы не можем ожидать, что GAE выполнит вставку данных с более чем 10 свойствами, или я что-то неправильно понимаю?

App Engine выполняет вставку просто отлично - вам просто нужноготовы потратить на это больше времени и больше операций.

1 голос
/ 24 октября 2011

Установите index=False для всех свойств, которые вам не нужно индексировать (т. Е. Свойства, которые вы не будете использовать в запросе).Это сокращает количество записей индекса, необходимых для сохранения объекта.

См. http://code.google.com/appengine/docs/python/datastore/queries.html#Introduction_to_Indexes для объяснения.

...