经济地从app引擎中删除数据

时间:2011-03-09 21:37:34

标签: python google-app-engine

我有一个流行的社交游戏,我将每个用户操作存储为数据存储中的Event实体,然后每天从GAE导出这些事件进行处理。现在我想从数据存储中删除所有这些实体,全部是3亿个。

我开始使用“datastore admin”。在我让它运行的最初几个小时内,它设法删除了大约200万个实体,并使用10美元的CPU来完成这项工作。因此,运行此删除似乎只需1500美元。我开始认为只要删除整个应用程序并将想要删除的项目复制到新应用程序中,我会更好。

还有其他选择吗?

更新

我在IRC中获得#appengine的建议,只需一次获取2000个实体的密钥并生成任务以将其删除(可以将键作为字符串传递给任务)可能比使用数据存储区管理工具便宜。我现在正在尝试这个,并且会记得明天报告,如果这看起来更便宜或者没有。

6 个答案:

答案 0 :(得分:3)

假设你的目标是删除最便宜的费用,而不是面对迁移,我会启动一个自我调度任务,在每次运行中清理几十/千个密钥,然后重新安排自己。我会故意在一个单独的队列上限制这个任务,这样任务就会经常运行,以避免在可能的情况下达到我的每日免费配额。

如果您愿意接受每天“可接受的”CPU成本,那么您可以减少对队列的限制,无论哪种方式,如果每次删除都不会花费太长时间来完成,那么它会更好不会过多地影响实例延迟。

如果您有复合索引,那么kevpie关于吸尘的评论也可能是相关的。

答案 1 :(得分:3)

首先删除索引将大大降低删除记录的成本。您还可以将删除率限制为每天免费分配6.5 CPU小时,以避免付费。

关于自己进行删除,你不可能比数据存储管理工具更有效率地执行它,数据存储管理工具已经只进行了密钥查询并使用了游标。

答案 2 :(得分:1)

我在开发一个并不总是自行清理的新应用时遇到了这个问题。经过几次实验后,我学到的是

  1. 调整您执行的删除操作数,以便尽可能多地执行删除而不会超时。对我来说,每个块大约有200个实体,但有时我可以用400而不是更多。

  2. 如果你能以这样的方式查询,你只能得到钥匙,那就更有效了。

  3. 我最大的效率提升来自使用Query Cursors。这些可以使更大的块大小实现更有效的查询。

  4. 使用计划来分散痛苦。这可以是自动cron调度或手动调度。由于我的项目仍然是alpha版,我会在晚上检查我的配额,并通过手动启动删除任务来用完未使用的配额。

  5. 向Google投诉。这让我感觉更好。

答案 3 :(得分:0)

您的意思是您在数据存储区管理员中使用了GQL?比如,delete from x...?那太贵了?嗯...

好吧,如果将删除功能集成到运行时代码中,可能会节省一些钱。即,如果用户已登录,您已经访问了数据库,可能具有相同的指示,那么为什么不删除呢?如果你做得对,你最终会减少整体交易。

答案 4 :(得分:0)

问题。 - 您的事件实体是否在实体组中分组? - 你有多少指数?任何复合的? - 未编入索引的属性数= False?

只是想确定删除的费用。

在开始删除实体之前,您可能会将某些索引清空。

答案 5 :(得分:0)

尝试通过remote_api删除。它将在很大程度上减少CPU小时的消耗 http://code.google.com/appengine/articles/remote_api.html