目标是减少一段经常运行的代码的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')
我是否缩短了此实体的获取时间?
按顺序回答您的问题:
是的,拆分模型会减少获取时间,但可能不是线性的.对于像你这样的相对较小的模型,差异可能不大.大型列表属性是增加获取时间的主要原因.
在更改模型后获取实体时仍会传输旧属性,因为数据存储区不了解模型.
但是,即使调用.put(),仍会存储已删除的属性.目前,有两种方法可以消除旧属性:使用新属性替换所有现有实体,或使用低级api.datastore接口,这类似于dict,可以轻松删除密钥.