我正在为自己的游戏开发高分Web服务,并且该服务正在Google App Engine上运行。
我的游戏有5个困难,所以我最初有5个板,每个板都有条目(player_login,得分和时间)。如果玩家提交的分数低于先前的分数,则将其解雇,因此每个玩家仅保留最高分数。
但是为了增加更多乐趣,我决定添加每日/每周/每月/每年的高分表。因此,我为每个难度创建了5个板,使其成为25个板。提交分数后,会将其保存到每个木板中,并且应该在每天/每周/每月/每年清除这些木板。
这是通过调用cron作业并从特定板卡删除所有条目来发生的。
问题来了:从数据存储中删除条目似乎很慢。从我的测试每日清理看来,删除单个条目大约需要200毫秒。
在最坏的情况下,如果该游戏非常受欢迎并且拥有10万名玩家,并且每个人在年度董事会中都有一个条目,那么这将花费100 000 * 0.012秒= 12000秒( 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思维方式中。
最佳答案
首先,一些小建议:
keys_only
查询,然后一次在整个键列表上调用db.delete()
。 但是,这些可能无法从根本上解决您的问题。我认为无法解决以下事实:删除大量记录(例如成千上万)将花费一些时间。我不确定这对您的用例来说是一个大问题,因为我可以看到一些有用的技术。
关于google-app-engine - 如何处理App Engine数据存储区上的每日/每周/每月董事会?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4523501/