2

我有一个拥有 1000 个实体的 Kind XXX_account。Kind 文件大小为 3 mb。每当我发送请求时,都需要调用 Query 来查找 Kind 中的某个实体。因此,我认为 google 费用在 20 小时内几乎是 4 美元。

有没有办法减少数据存储读取操作?我计划在 txt 文件中存储 1000 个实体,以便我每次都需要读取数据存储。

Datastore Read Operations       5.01 Million Ops    4.96    $0.70/ Million Ops  $3.48   

我的模型.py

class MyUser(DatastoreUser):
    pass

class XXXAccount(db.Model):
    user = db.ReferenceProperty(MyUser,
                                   collection_name='xxx_accounts')


    id = db.StringProperty(required=True)
    created = db.DateTimeProperty(auto_now_add=True)
    updated = db.DateTimeProperty(auto_now=True)
    name = db.StringProperty(required=True)
    username = db.StringProperty(required=True)
    profile_url = db.StringProperty(required=True)
    aaa = db.StringProperty(required=True)
    bbb = db.StringProperty(required=True)

视图.py

@login_required
def updateprofile(request):
    number_form = NumberForm()
    if request.method =="POST" and number_form.validate(request.form):
        acc_num_str = number_form['nb']  
        acc_num = int(acc_num_str)

        current_user = request.user
        xxx_account = current_user.xxx_accounts[acc_num] #Query
        DO SOME THING WHICH DOES NOT RELATED TO READ AND WRITE DATASTORE OPERATION
return......

更新:

  • 代码已发布

  • OMG,仅 1000 个请求 0.32 美元。

4

1 回答 1

1

您应该在查询实体的地方发布模型定义和代码。

常见建议:

如果您想找到某个实体,只有一种正确的方法 - 使用实体键(id数字或key_name字符串)来获取它。Datastore 在保存实体时会自动为实体分配一些 ID,或者您可以在创建实体时手动设置一些不错的 key_name。

要获取实体的 id 或 key_name,请使用 DB 中的 Model.key().id() 或 Model.key().name() 或 NDB 中的 Model.key.id()。

然后,如果您使用旧的 DB API,则可以使用Model.get_by_id()或 Model.get_by_key_name() 方法通过 id 或 key_name 获取实体;如果使用新的 NDB API,则可以使用Key.get()方法。您可以将 id 或 key_name 传递给 URL - http://example.com/getentity/[id]。

此外,使用 Memcache 缓存实体。缓存可以极大地减少数据存储的使用。顺便说一句,NDB 自动使用缓存。

ps 抱歉,我不能发布超过 2 个链接。

于 2013-03-23T09:24:08.130 回答