Ruby on rails 复杂算法的计算应该在哪里进行

Ruby on rails 复杂算法的计算应该在哪里进行,ruby-on-rails,hadoop,scalability,mahout,Ruby On Rails,Hadoop,Scalability,Mahout,背景: 我是一名软件工程专业的学生,我正在研究几种推荐系统的算法。其中一种算法,协同过滤有很多循环,它必须经过所有用户,每个用户对电影或其他应评项目的所有评分。 我正在考虑在ruby上为rails应用程序实现它 关键是要处理大量数据,因此: 这应该在数据库中完成吗?使用常规查询?使用PL/SQL或类似的东西(测试dbs非常耗时和困难,特别是对于这类算法) 我应该做一个后台工作来缓存算法的结果吗?(如果是这样,数据在内存中进行处理,如果有数百万用户,这种扩展性如何) 我应该在每次有请求或每次x请求

背景:
我是一名软件工程专业的学生,我正在研究几种推荐系统的算法。其中一种算法,协同过滤有很多循环,它必须经过所有用户,每个用户对电影或其他应评项目的所有评分。 我正在考虑在ruby上为rails应用程序实现它

关键是要处理大量数据,因此:

  • 这应该在数据库中完成吗?使用常规查询?使用PL/SQL或类似的东西(测试dbs非常耗时和困难,特别是对于这类算法)

  • 我应该做一个后台工作来缓存算法的结果吗?(如果是这样,数据在内存中进行处理,如果有数百万用户,这种扩展性如何)

  • 我应该在每次有请求或每次x请求时运行算法吗?(同样,数据在内存中处理)

  • 问题:

    我知道有些东西可以做到这一点,比如ApacheMahout,但它们依赖Hadoop进行扩展。还有别的出路吗?ruby是否有类似于Mahout或机器学习的工具?如果有,计算是如何进行的?

    以下是我对每种方法的看法:

  • 不,不应该。有些计算在数据库中运行要快得多,有些则不然。然而,要准确地测试应该在数据库中运行哪些计算是很困难和耗时的,并且您会正确地体验到算法的某些部分在postgreSQL或您使用的任何东西中都很慢。 更重要的是:这不是运行逻辑的正确位置,正如您自己所说,这将很难测试,而且总体而言,这是一种糟糕的做法。每次数据库必须计算算法时,它也会影响请求的整体性能。此外,数据库仍将使用大量内存来处理此问题,因此这不是一个优势

  • 到目前为止,这是最好的解决方案。请参阅下面的详细说明

  • 这是一个比第一个好得多的解决方案。然而,这意味着你的应用程序性能将非常不稳定。有些时候,所有的资源对于正常的请求都是免费的,有些时候,您会在计算中使用所有的资源

  • 选项2是最好的解决方案,因为它不会影响应用程序其余部分的性能,并且更易于扩展,因为它是独立工作的。例如,如果您的员工无法跟上进度,您可以添加更多正在运行的进程

    更重要的是,您可以在单独的服务器上运行后台进程,从而轻松监控内存和资源使用情况,并根据需要扩展服务器

    即使对于实时更新,后台作业也是最好的解决方案(当然,如果计算不够小,无法在请求中完成)。您可以创建一个“高优先级”队列,该队列具有足够的资源,几乎总是空的。如果需要通过重新加载向用户显示结果,则必须在后台作业完成后添加某种推送通知。然后,此通知可以通过javascript触发页面更新(您还可以查看rails 4的新功能)

    我会推荐一些类似Redis的东西。然后,您可以将结果缓存在memcache中,或者每次都可以重新计算结果,这取决于您需要计算的频率。然而,有了这个解决方案,如果您需要的话,设置一个稳定的缓存会容易得多

    在我工作的地方,我们有一个应用程序,它运行一些繁重的查询和大量的计算,就像这样。每天晚上,这些作业都会排队,然后在接下来的几个小时内在一台独立的服务器上运行。它的伸缩性非常好,而且很容易用new relic进行监控


    希望这有帮助,也有意义(我知道我的英语不是很好),但是如果我误解了什么或者你有更多的问题,请随时提问。

    这不会直接回答你的问题,但可能会有帮助:回答得很好,谢谢。但是,如果计算预计是“快速”的,即必须对全球客户正在进行的所有个人购买进行操作的实时仪表盘,会发生什么情况?数据不能在后台线程上缓存或处理,那么怎么做呢?所有这些计算都需要快速,还是有些计算比其他计算更重要?还有,是几次大的计算还是一次又一次的计算?我心里并没有什么特别的问题,但基本上,如果不需要实时计算,你可以在后台工作中进行计算,并缓存或持久保存结果。但是,当需要快速的结果时,例如股票市场或相关市场,你能做什么?也许这是无关的,但StumbleUpon(我认为)是一个类似的场景:他们根据你和你朋友的喜好计算你的下一次绊倒,并在每次绊倒时推荐更精确的内容。假设每次你“喜欢”某样东西时,他们确实会重新计算你的下一次绊倒,这还会在后台进行吗?简短回答:是的!长句回答:如果你将后台作业作为一种工具来实现,它可能会非常快。例如,在sidekiq github网站上,他们是否警告您后台作业处理速度太快,如果由“创建后”触发,数据库查询甚至不会在处理之前完成,这可能会导致错误。我会更新我的答案来解释更多。谢谢@joklan的帮助。我已经接受了你的答案,但如果你能为此改进答案,那就太好了