谷歌应用引擎数据存储区性能不好,而数据输入有更多属性

时间:2011-10-20 17:22:52

标签: python google-app-engine google-cloud-datastore

版本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毫秒来在谷歌应用引擎上执行简单的放置操作(黄色或红灯)CPU时间。在合同中,版本2代码仅使用大约300毫秒。 (两者都在HRD数据存储上进行测试)

在M / S数据存储上,版本1代码将使用大约400毫秒,版本2代码将使用大约150毫秒。

我可以想象版本1与版本2相比会更慢,因为它使用更多的键索引。但是,很难相信这种差异是如此巨大。谷歌应用程序引擎无法处理如此简单的任务也令人惊讶。

这是否意味着我们不能指望GAE对具有10个以上属性的数据执行插入操作 还是我误解了什么?

THX

2 个答案:

答案 0 :(得分:1)

在您不需要编入索引的所有属性上设置index=False(即,您不会在查询中使用的属性)。这减少了保存实体所需的索引写入次数。

请参阅http://code.google.com/appengine/docs/python/datastore/queries.html#Introduction_to_Indexes以获取解释。

答案 1 :(得分:1)

你的第一个模型有13个索引属性,而你的第二个模型只有5个。第一个模型需要更多时间也不足为奇 - 你可以通过将属性设置为无索引来减少它,正如Dave建议的那样。

  

这是否意味着我们不能指望GAE对数据执行插入   超过10个属性还是我误解了什么?

App Engine可以很好地执行插入 - 你只需要做好准备就可以花更多的时间和更多的操作。