Google app engine 降低谷歌数据存储读取操作费用

Google app engine 降低谷歌数据存储读取操作费用,google-app-engine,google-cloud-datastore,Google App Engine,Google Cloud Datastore,我有一个有1000个实体的XXX_账户。种类文件大小为3 mb。每当我发送请求时,都需要调用查询来查找该类中的某个实体。因此,我认为谷歌的费用在20小时内几乎是4美元 是否仍有减少数据存储读取操作的方法?我计划在txt文件中存储1000个实体,以便每次都需要读取数据存储 Datastore Read Operations 5.01 Million Ops 4.96 $0.70/ Million Ops $3.48 我的模特 class MyUser(Datast

我有一个有1000个实体的XXX_账户。种类文件大小为3 mb。每当我发送请求时,都需要调用查询来查找该类中的某个实体。因此,我认为谷歌的费用在20小时内几乎是4美元

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

Datastore Read Operations       5.01 Million Ops    4.96    $0.70/ Million Ops  $3.48   
我的模特

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......
更新:

  • 代码已发布

  • 天哪,1000个请求只需0.32美元


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

共同建议:

如果您想查找某些实体,只有一种正确的方法—使用实体键(
id
number或
key\u name
string)获取它。数据存储在保存实体时会自动为其分配一些id,或者您可以在创建实体时手动设置一些好的密钥名称

要获取实体的id或密钥名称,请在DB中使用Model.key().id()或Model.key().name(),或在NDB中使用Model.key.id()

然后,您可以通过id或key\u name或Model获取实体。如果使用旧的DB API,则通过key\u name()方法获取实体;如果使用新的NDB API,则通过方法获取实体。您可以将id或密钥名称传递给URL-http://example.com/getentity/[id]

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


p、 很抱歉,我发布的链接不能超过2个。

绝对没有理由只为了找到一个链接而阅读所有实体。这就是查询的目的。@DanielRoseman我上传了我的代码。请检查这一行xxx_account=current_user.xxx_accounts[acc_num]#query我无法解释current_user.xxx_accounts是什么。它看起来像是所有帐户的列表,必须来自所有帐户的查询。您只想查询您想要的一个帐户。很抱歉,current\u user.XXX\u帐户应该是current\u user.XXX\u帐户。xxx_账户是一个集合,所以current_user.xxx_账户是查询用户current_user的xxx_账户。谢谢,我上传了我的代码,请看一看。我不使用key和id获取数据实体,我只是根据它的顺序选择一个实体。请检查此行xxx_account=当前用户。xxx_accounts[acc_num]#查询。我认为它将使用更少的数据存储读取操作。我不知道Memcache,也许我会试试。thanxLook。当您使用ReferenceProperty时,您在MyUser模型中调用了
xxx\u帐户
属性。访问此属性时,将返回该对象。当您通过[]访问此属性时,将执行此查询并返回所有引用的XXXAccount实体、每个请求。您必须做的最小操作—它可以更有效地使用返回的查询对象,例如—current_user.xxx_accounts.filter('some_unique_field'=acc_num).get()。此外,如果您将XXXAccount实体的键存储在MyUser模型的ListProperty中,则效率会更高。然后,您可以通过DB的特殊函数-DB.get(current_user.xxx_accounts[acc_num])获取引用的xxxaAccount实体。我现在无法检查,但如果您想使用带偏移量的fetch,您应该使用关键字参数-fetch(limit=1,offset=acc_num)。还请记住GAE的注意事项:注意:使用偏移量只会避免将跳过的实体返回到应用程序,但这些实体仍然是在内部检索的……并且您的应用程序会为检索它们所需的读取操作付费[剪切]“数据存储调用的成本”在页面上表示获取实体(按键)成本1读取,查询实体成本1读取+每个实体1读取。所以XXXAccounts.get_by_key_name(keyname)更好。