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

时间:2013-06-30 21:43:17

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

本周末,我在一个新项目上破坏了我的每日免费配额。作为参考,这是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)

这就是我所知道的:

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

我必须在这里做错事,因为每分钟25分钟是1小时写入,而不是我现在看到的大约50,000分钟。

由于

3 个答案:

答案 0 :(得分:5)

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

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

谢谢你们!

答案 1 :(得分:5)

这里混合了两个不同的东西:编写API调用(代码调用的代码)和低级数据存储区写操作。请参阅关系的开票凭证:Pricing of Costs for Datastore Calls(第二部分)。

这是相关部分:

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 每小时数据存储写入操作

答案 2 :(得分:1)

每天1500 * 24 = 36,000次写入,这非常接近每日配额。