为什么我的数据存储区写操作如此之高?

Ant*_*iga 1 python google-app-engine app-engine-ndb google-cloud-datastore

我本周末在一个新项目上破坏了我的每日免费配额.作为参考,这是0.05万次写入,如果我的数学是正确的,则为50,000.

下面是我的项目中唯一进行任何数据存储区写操作的代码.

    old = Streams.query().fetch(keys_only=True)
    ndb.delete_multi(old)
    try:
        r = urlfetch.fetch(url=streams_url,
                           method=urlfetch.GET)
        streams = json.loads(r.content)
        for stream in streams['streams']:
            stream = Streams(channel_id=stream['_id'],
                             display_name=stream['channel']['display_name'],
                             name=stream['channel']['name'],
                             game=stream['channel']['game'],
                             status=stream['channel']['status'],
                             delay_timer=stream['channel']['delay'],
                             channel_url=stream['channel']['url'],
                             viewers=stream['viewers'],
                             logo=stream['channel']['logo'],
                             background=stream['channel']['background'],
                             video_banner=stream['channel']['video_banner'],
                             preview_medium=stream['preview']['medium'],
                             preview_large=stream['preview']['large'],
                             videos_url=stream['channel']['_links']['videos'],
                             chat_url=stream['channel']['_links']['chat'])
            stream.put()
        self.response.out.write("Done")
    except urlfetch.Error, e:
        self.response.out.write(e)
Run Code Online (Sandbox Code Playgroud)

这就是我所知道的:

  • "流"中永远不会超过25个"流".保证可以完全调用.put()25次.
  • 我在此调用开始时从表中删除了所有内容,因为每次运行时都需要刷新所有内容.
  • 现在,这段代码每隔60秒运行一次.它永远不会超过每分钟运行一次.
  • 我通过启用Appstats验证了所有这些,我可以看到datastore_v3.Put计数每分钟增加25,如预期的那样.

我必须在这里做错事,因为每分钟25分钟就是1,500小时,而不是我现在看到的~5,000分钟.

谢谢

Ant*_*iga 5

好像我终于知道发生了什么,所以我想在这里更新.我找到了这个较旧的答案:https://stackoverflow.com/a/17079348/1452497.

我错过了某个地方,被索引的属性以某种方式将写入乘以至少10的因子,我没想到.我不需要索引所有内容,在关闭模型中的索引之后,我注意到写操作会掉落DRAMATICALLY.到了我期望的地方.

多谢你们!


Pet*_*ego 5

您在这里混合了两个不同的东西:编写API调用(代码调用的内容)和低级数据存储区写操作.请参阅关系的开票凭证:数据存储区呼叫的成本定价(第二部分).

这是相关部分:

New Entity Put (per entity, regardless of entity size) = 2 writes + 2 writes per indexed property value + 1 write per composite index value

在您的情况下,Streams有15个索引属性导致:2 + 15*2 =每次写API调用写入OP.

每小时总计:60(请求/小时)*25(放置/请求)*32(操作/放置)= 每小时48,000次数据存储写入操作