减少谷歌数据存储读取运营费用

时间:2013-03-23 03:53:56

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

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

无论如何都要减少数据存储区的读取操作?我打算在txt文件中存储1000个实体,这样我每次都需要读取数据存储区。

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

我的model.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)

view.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美元。

1 个答案:

答案 0 :(得分:1)

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

常见建议:

如果你想找到某些实体,那么只有一种正确的方法 - 使用实体密钥(id数字或key_name字符串)来得到它。数据存储在保存时会自动为实体分配一些ID,或者在创建实体时可以手动设置一些漂亮的key_name。

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

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

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

P.S。对不起,我发不到2个以上的链接。