7

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

这甚至行得通吗?

当我减小实体的大小时,我可以期望具有数百个键的 db.get() 的 API 时间大致线性减少吗?目前该实体附有以下数据:9 个字符串、9 个布尔值、8 个整数、1 个 GeoPt、2 个日期时间、1 个文本(平均大小 ~100 字节 FWIW)、1 个参考、1 个字符串列表(平均大小 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()

假设我将 Thing 重新定义为精简并推出新版本:

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

我又拿回来了:

thing_again = Thing.get_by_key_name('thing1')

我是否减少了该实体的获取时间?

4

3 回答 3

12

按顺序回答您的问题:

  • 是的,拆分模型会减少获取时间,尽管可能不是线性的。对于像您这样相对较小的模型,差异可能不会很大。大型列表属性是增加获取时间的主要原因。
  • 在模型更改后获取实体时,旧属性仍将被传输,因为数据存储不了解模型。
  • 但是,即使调用 .put(),删除的属性仍然会被存储。目前,有两种方法可以消除旧属性:将所有现有实体替换为新实体,或者使用较低级别的 api.datastore 接口,该接口类似于 dict 并且可以轻松删除键。
于 2009-10-10T18:13:35.127 回答
1

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

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

在“从数据存储中删除已删除的属性”标题下

于 2010-01-06T21:29:52.473 回答
0

如果我想减小实体的大小,是否有必要将旧实体迁移到具有新定义的实体?

是的。GAE 数据存储只是一个大的键值存储,它对您的模型定义一无所知。因此,在您输入新值之前,旧值将是旧值!

于 2009-10-10T13:48:35.100 回答