经济地从应用引擎删除数据

8 投票
6 回答
545 浏览
提问于 2025-04-16 13:23

我有一个很受欢迎的社交游戏,我把每个用户的操作都存储为一个事件(Event)在数据存储中,然后每天一次把这些事件从GAE导出进行处理。现在我想把这些事件全部删除,数量高达3亿个。

我开始使用“数据存储管理工具”来处理这个问题。在最开始的几个小时里,它删除了大约200万个事件,花费了10美元的计算资源。所以看起来光是删除这些事件就要花1500美元。我开始觉得,干脆把整个应用删除,然后把我想删除的东西复制到新的应用里可能更划算。

还有其他选择吗?

更新

我在IRC的#appengine频道得到了建议,建议我每次获取2000个事件的键,然后分批删除这些事件(可以把键作为字符串传递给任务),这样可能比使用数据存储管理工具便宜。我现在正在尝试这个方法,如果这确实更便宜,我会记得明天回来报告一下。

6 个回答

1

在开发一个新应用时,我遇到了一个问题,就是这个应用有时候不太会自己清理。经过几次实验,我总结出了一些经验:

  1. 要调整删除的数量,尽量在不超时的情况下多删除一些。对我来说,大约每次删除200个实体是比较合适的,有时候可以做到400个,但绝对不能超过这个数量。

  2. 如果你能只查询到键值,那样会更高效。

  3. 我最大的效率提升来自于使用查询游标。这个工具让我能更高效地进行查询,并且可以处理更大的数据块。

  4. 利用调度来分散工作量。可以使用自动的定时任务,或者手动安排时间。因为我的项目还在初期阶段,我会在晚上检查我的配额,然后手动启动删除任务,利用掉未使用的配额。

  5. 向谷歌抱怨一下。这让我感觉好多了。

3

假设你的目标是以最低的成本来删除数据,而不是进行迁移,我会建议你启动一个自我调度的任务,这个任务每次可以清理几百到几千个数据键,然后再自己安排下一次运行。我会故意让这个任务在一个单独的队列中运行,这样可以控制它的频率,尽量避免每天超过免费的使用额度。

如果你每天能接受一些“合理”的CPU使用成本,你可以让这个队列的运行频率稍微高一些。不过,不管怎样,最好是每次删除的时间不要太长,这样就不会对系统的响应速度造成太大的影响。

kevpie提到的关于清理的建议,如果你有复合索引的话,可能也会很有用。

3

先删除索引可以大大降低删除记录的费用。你还可以限制每天的删除速度,保持在你免费分配的6.5个CPU小时以内,这样就可以避免付费。

至于自己去删除记录,实际上你可能做得没有数据库管理工具高效。这个工具已经能够只查询关键字,并且使用了游标来处理数据。

撰写回答