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

时间:2009-10-10 11:50:55

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

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

这甚至有用吗?

我可以期望db.get()的API时间有几百个键 当我减小实体的大小时,大致线性地减少? 目前,该实体附有以下数据:9字符串,9 布尔值,8个整数,1个GeoPt,2个DateTime,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')

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

3 个答案:

答案 0 :(得分:12)

按顺序回答您的问题:

  • 是的,拆分模型会减少获取时间,但可能不是线性的。对于像你这样的相对较小的模型,差异可能不大。大列表属性是增加获取时间的主要原因。
  • 在更改模型后获取实体时仍会传输旧属性,因为数据存储区不了解模型。
  • 但是,即使您调用.put(),仍会存储已删除的属性。目前,有两种方法可以消除旧属性:使用新属性替换所有现有实体,或使用低级api.datastore接口,这类似于dict,可以轻松删除密钥。

答案 1 :(得分:1)

要从实体中删除属性,您可以将模型更改为Expando,然后使用 delattr 。它在App Engine文档中有记录:

http://code.google.com/intl/fr/appengine/articles/update_schema.html

标题为“从数据存储中删除已删除的属性

答案 2 :(得分:0)

  

如果我想缩小我的尺寸   实体,是否有必要迁移   旧实体与新实体   定义

是。 GAE数据存储只是一个大的键值存储,它对模型定义一无所知。所以旧值将是旧值,直到您将新值放入!