从app engin中经济地删除数据

2024-05-29 09:52:58 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我开始用“数据存储管理”来处理这个问题。在我让它运行的最初几个小时里,它成功地删除了大约200万个实体,并使用了10美元的CPU来完成这个任务。所以运行这个删除操作似乎要花费1500美元。我开始觉得我最好还是删除整个应用程序,然后将我不想删除的项目复制到新的应用程序中。在

还有其他选择吗?在

更新

我在IRC中得到了关于appengine的建议,简单地一次获取2000个实体的密钥并生成任务来删除它们(可以将密钥作为字符串传递给任务)可能比使用数据存储管理工具便宜。我现在正在尝试这个,如果它看起来更便宜或者不便宜,我会尽量记住明天再报告。在


Tags: 数据项目用户实体应用程序游戏密钥事件
3条回答

假设您的目标是以最便宜的成本删除,而不是面对迁移,我将启动一个自调度任务,它将在每次运行中清理几十万个密钥,然后重新调度自己。我会有目的地将这个任务限制在一个单独的队列中,这样任务运行的频率只有在可能的情况下才能避免达到我的每日空闲配额。在

如果您愿意忍受每天的CPU开销“可以接受”,那么您可以减少队列的限制,无论哪种方式,如果每次删除都不需要太长时间来完成,这样就不会对实例延迟造成太大的影响。在

如果你有综合指数的话,kevpie关于抽真空的评论也可能有意义。在

首先删除索引将大大降低删除记录的成本。你也可以限制你的删除率,以保持在每天6.5小时的CPU小时内免费分配,以避免付费。在

关于自己执行删除操作,不太可能比datastore管理工具更有效地执行删除操作,该工具已经完成了仅限键查询并使用游标。在

我在开发一个新的应用程序时遇到了这个问题,但它并不总是自动清理干净。做了几次实验后,我学到的是

  1. 调整删除的数量,以便在不超时的情况下尽可能多地删除。对我来说,每个块大约有200个实体,虽然有时我可以逃脱400个实体的惩罚,但永远不会超过400个实体。

  2. 如果您能够以只获取密钥的方式进行查询,则效率更高。

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

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

  5. 向谷歌投诉。这让我感觉好多了。

相关问题 更多 >

    热门问题