当前位置:  开发笔记 > 程序员 > 正文

通过减少实体大小来提高App Engine性能

如何解决《通过减少实体大小来提高AppEngine性能》经验,为你挑选了1个好方法。

目标是减少一段经常运行的代码的CPU成本和响应时间,并且每次必须db.get()几百个密钥.

这甚至有用吗?

我可以期望具有数百个密钥的db.get()的API时间大致线性减少,因为我减小了实体的大小吗?目前的实体贴有以下数据:9字符串,布尔9,8整数,1 GeoPt,2日期时间,1个文本(平均大小:约100个字节FWIW),1个参考,1周的StringList(平均大小为500字节).目标是将绝大多数此类数据移动到相关类中,以便快速获取主模型的核心.

如果它确实有效,它是如何实现的?

在重构之后,我仍然需要获得相同的高成本获取现有实体吗?文档说明同时获取模型的所有属性.旧的不需要的属性是否会在我的硬币上转移到RPC而用户在等待?换句话说:如果我想减少实体的加载时间,是否有必要将旧实体迁移到具有新定义的实体?如果是这样,重新放入()实体是否足够,或者我必须在一个全新的密钥下保存?

考虑:

class Thing(db.Model):
    text    = db.TextProperty()
    strings = db.StringListProperty()
    num     = db.IntegerProperty()

thing = Thing(key_name='thing1', text='x' * 10240,
      strings = ['y'*500 for i in range(10)], num=23)
thing.put()

假设我重新定义要精简的东西并推出一个新版本:

class Thing(db.Model):
    num = db.IntegerProperty()

我再次取回它:

thing_again = Thing.get_by_key_name('thing1')

我是否缩短了此实体的获取时间?



1> Nick Johnson..:

按顺序回答您的问题:

是的,拆分模型会减少获取时间,但可能不是线性的.对于像你这样的相对较小的模型,差异可能不大.大型列表属性是增加获取时间的主要原因.

在更改模型后获取实体时仍会传输旧属性,因为数据存储区不了解模型.

但是,即使调用.put(),仍会存储已删除的属性.目前,有两种方法可以消除旧属性:使用新属性替换所有现有实体,或使用低级api.datastore接口,这类似于dict,可以轻松删除密钥.

推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有