gpt4 book ai didi

google-app-engine - 如何处理 App Engine 数据存储上的每日/每周/每月板?

转载 作者:行者123 更新时间:2023-12-02 07:49:35 24 4
gpt4 key购买 nike

我正在为我的游戏开发高分网络服务,它在 Google App Engine 上运行。

我的游戏有 5 个难度,所以我最初有 5 个面板,每个面板都有条目(玩家登录、分数和时间)。如果玩家提交的分数低于之前的分数,它将被取消,因此只保留每位玩家的最高分数。

但为了增加更多乐趣,我决定加入每日/每周/每月/每年的高分表。所以我为每个难度创建了 5 个板,共 25 个板。提交分数后,它会保存到每个板中,并且应该在每天/每周/每月/每年清除板。

这是通过调用 cron 作业并删除特定版 block 中的所有条目来实现的。

问题来了:从数据存储中删除条目看起来很慢。从我的测试日常清理来看,删除单个条目似乎需要大约 200 毫秒。

在最坏的情况下,如果游戏非常受欢迎并且有 100,000 名玩家,并且他们每个人都会进入年度榜单,则需要 100,000 * 0.012 秒 = 12 000 秒(3 小时!!)清除该板。我认为我们被允许在 App Engine 中拥有最多 30 秒的工作,所以这是行不通的。

我正在删除 following code (thanks to Nick Johnson) :

q = Score.all(keys_only=True).filter('b = ',boardToClear)
results = q.fetch(500)
while results:
self.response.out.write("deleting one batch;")
db.delete(results)
q = Score.all(keys_only=True).filter('b = ',boardToClear).with_cursor(q.cursor())
results = q.fetch(500)

你建议我如何处理这个问题?

我想到的一种方法是使用任务队列并删除比每个板允许的更旧的分数,即已经过期但数量较少的分数。这样我就不会达到一个任务的 CPU 限制,但清理不会(几乎)是即时的,所以我的 12000 秒长的清理将被分成 1200 个任务,每个大约 10 秒长。

但我认为我做错了什么,这种操作在关系数据库中完成会快很多。可能我的数据存储和评分方法有问题,因为被锁定在 RDBMS 思维模式中。

最佳答案

首先,几个小建议:

  1. 即使您在批处理过程中删除项目,删除每个项目是否需要 200 毫秒?最快的删除方法应该是执行 keys_only 查询,然后立即对整个键列表调用 db.delete()
  2. 1.4.0 起,后台工作(例如您正在考虑的 cron 作业或队列任务)的 30 秒限制最近放宽至 10 分钟。 .

不过,这些可能无法从根本上解决您的问题。我认为没有办法解决删除大量记录(例如数十万条)需要一些时间的事实。不过,我不确定这对您的用例来说是否是一个大问题,因为我可以看到一些有用的技术。

  1. 按照您的建议,使用任务队列将长时间运行的任务拆分为几个较小的任务。您的用例(删除大量与特定查询匹配的项目)非常适合 map-reduce 任务。尼克约翰逊的 blog post on the Mapper API可能对您很有帮助(这样您就不必自己编写所有任务管理代码)。
  2. 您是否需要立即删除所有过时的董事会条目?如果您有一个字段列出了特定条目计入的周、月或年,您可以在该字段上建立索引,然后仅在可见排行榜上显示当月的条目。 (毕竟磁盘空间很便宜。)然后,如果您想缓慢地(比方说,在几小时内,而不是几毫秒内)删除过时的数据,您可以在后台执行此操作,而不会在您的计算机上存有不正确的数据排行榜。

关于google-app-engine - 如何处理 App Engine 数据存储上的每日/每周/每月板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4523501/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com