背景
我是一名软件工程专业的学生,我正在检查推荐系统的几种算法。其中一种算法,协同过滤有很多循环,它必须通过所有用户和每个用户对电影或其他有价值项目所做的所有评级。
我正在考虑在ruby上为rails应用程序实现它。
重点是要处理大量数据:
这应该在数据库中完成吗?使用常规查询?使用PL / SQL或类似的东西(测试dbs是非常耗时和困难的,特别是对于这些算法)
我应该做一个缓存算法结果的后台工作吗? (如果是这样的话,数据会在内存上处理,如果有数百万用户,那么这种扩展程度如何)
每次有请求或每个x请求时,我都应该运行算法吗? (再次,数据在内存中处理)
问题:
我知道有些事情像Apache Mahout那样做,但他们依靠Hadoop进行扩展。还有另一种出路吗?有没有Mahout或机器学习等同于ruby,如果有,计算在哪里发生?
答案 0 :(得分:2)
以下是我对每种方法的看法:
不,不应该。在数据库中运行一些计算会快得多,有些则不会。然而,准确测试应该在db中运行哪些计算将是困难和耗时的,并且您将正确地体验到postgreSQL或您使用的任何算法的某些部分都很慢。 更重要的是:这不是运行逻辑的正确位置,正如你自己说的那样,它很难测试,而且总的来说这是一个糟糕的做法。每次db必须计算算法时,它还会影响整体请求的性能。此外,db仍会使用大量内存处理,因此这不是一个优势。
到目前为止最好的解决方案。有关详细说明,请参阅下文。
这是一个比第一个好得多的解决方案。但是,这意味着您的应用程序性能会非常不稳定。有时,所有资源对于正常请求都是免费的,有时您会在计算时使用所有资源。
选项2是最佳解决方案,因为它不会影响应用程序休息的性能,并且在单独工作时更容易扩展。例如,如果您遇到工作人员无法跟上,您可以添加一些正在运行的进程。
更重要的是,您可以在单独的服务器上运行后台进程,从而轻松监控内存和资源使用情况,并根据需要扩展服务器。
即使对于实时更新,后台作业也是最佳解决方案(当然,如果计算量不足以在请求中完成)。您可以创建一个“高优先级”队列,该队列具有足够的资源,几乎总是为空。如果需要通过重新加载向用户显示结果,则必须在后台作业完成后添加某种推送通知。然后,此通知可以通过javascript触发页面上的更新(您还可以查看rails 4的新live stream功能。)
我会向Redis推荐类似Sidekiq的内容。然后,您可以将结果缓存在内存缓存中,或者每次都可以重新计算结果,这实际上取决于您需要多长时间计算一次。但是,使用此解决方案,如果需要,可以更轻松地设置稳定的缓存。
在我工作的地方,我们有一个应用程序运行一些繁重的查询,并进行大量的计算。每晚这些作业都会排队,然后在接下来的几个小时内在隔离的服务器上运行。这很好地扩展,并且很容易用新的遗物进行监控。
希望这有帮助,并且有意义(我知道我的英语不完美),但请随意询问我是否误解了某些内容或者您有更多问题。