总体评级计算的最佳实践

时间:2013-06-24 05:52:25

标签: algorithm rating

我有基于LAMP的业务应用程序。 SugarCRM更精确。目前有120多名活跃用户。每个用户每天都会生成一些用于复杂计算的记录,以获得所谓的“个人评级”。

计算一个“个人评级”值需要大约6秒钟。之前没有一个大问题:每个用户点击提供的链接开始“个人评级”计算,等待6-7秒,并显示值。

但现在我需要实施“整体评级”计算。这意味着除了“个人评级”之外,我还要计算并显示给用户:

  • 应用程序的所有用户中的最低个人评级

  • 应用程序的所有用户中的最大个人评级

  • 当前用户在所有个人评级范围内的位置。

说,当前用户的个人评分等于220分,评分的最小值为80,最大值为235,他在所有用户中排名第23位。

(imho)有哪些主要问题需要解决?

  1. 如果一次计算持续6秒,则整体计算将花费超过10分钟。我认为在这个时期使应用程序几乎无法访问是不合适的。如果用户数量在不久的将来会增加2-3倍呢?

  2. 这些计算可以作为夜间工作完成,但所有用户都在不同的时区。在俄罗斯极端时区之间的差异是9小时。因此,俄罗斯西部地区的人们仍在“今天”工作。虽然东部地区的人们正在醒来“明天”工作。那么在这种情况下夜间工作的最佳时间是什么?

  3. 是否有建立此类评级系统的最佳实践方法?

2 个答案:

答案 0 :(得分:0)

只提供所提供的信息,我看到的唯一选项是:

  1. 显而易见的一个 - 减少评分计算所需的时间(6秒计算1个用户的评分似乎很多)

  2. 如果可能,请根据需要重新计算某些中间值(例如,有10个构成评级的值,所有基于不同的数据,当某些数据发生变化时,标记相应的值)重新计算的价值)。要么重新计算:

    • 在每日重新计算期间或
    • 更新发生时

  3. 部分批量计算 - 仅按所选间隔重新计算用户评级的x(其中x是某个选定值) - 缺点是,在某些时候,某些评级可能已过期

  4. 计算是否不忙 - 要么连续重新计算评级,要么只按选定的时间间隔进行评分,而不是锁定系统,让它作为后台进程运行,只在系统空闲时才能正常工作

答案 1 :(得分:0)

(抱歉,没有管理“长”评论发布;所以决定发帖作为答案)

@Dukeling

几乎所有时间进行上述计算的SQL查询只是应该在PHP代码中执行的业务逻辑的复制。逻辑被移到SQL中,希望减少计算时间。好的,我将尝试优化SQL查询并在PHP代码中执行逻辑。

假设优化后的应用程序仅计算1秒的个人评级。大!但即使在这种情况下,登录系统的第一个用户应该等待120秒(120+用户* 1秒= 120秒)来计算总体评级并获得其中的位置。

我正在考虑实施以下方法:

  1. 让我们有2个“整体评分” - “今天”和“昨天”。

  2. 为了显示目的,我们将使用“昨天”整体评级表示为已经排序的巨大PHP数组。

  3. 当用户点击计算链接时,他开始“今天”计算,但应用程序显示“昨天”值。因此,我们可以快速访问“昨天”评级,每个用户随机启动将于明天为他们显示的评级计算。

  4. 用户列表按时区划分。每小时一个cron作业开始检查所选时区中是否有任何用户没有计算“今天”个人评级(例如用户没有登录应用程序)。如果是这样,应用程序开始计算个人评级并将其值放在“今天”(仍然不可见)的评级数组中。因此,我们有一个cron作业,每晚为每个特定于时区的用户组运行,并在用户未登录系统时填补可能的空白。

  5. 在所有时区中的所有用户都已完成后,应用程序
    1. 对“今天”阵列进行排序,
    2. 删除“昨天”一个,
    3. 在“昨天”和
    4. 中重命名“今天”
    5. 初始化新的“今天”。
  6. 你怎么看?是否足够合理?

相关问题