ruby-on-rails - 复杂算法应该在哪里进行计算

标签 ruby-on-rails hadoop scalability mahout

背景:
我是一名软件工程专业的学生,​​我正在检查推荐系统的几种算法。这些算法之一,协同过滤有很多循环,它必须遍历所有用户,并且对于每个用户,他对电影或其他可评分项目的所有评分。 我正在考虑在 Rails 应用程序的 Ruby 上实现它。

关键是有很多数据要处理,所以:

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

  2. 我应该做一个缓存算法结果的后台作业吗? (如果是这样,数据是在内存中处理的,如果有数百万用户,这个规模有多好)

  3. 我应该在每次有请求时运行算法还是每 x 个请求运行一次算法? (同样,数据是在内存中处理的)

问题:
我知道有些东西可以做到这一点,比如 Apache Mahout,但它们依赖于 Hadoop 进行扩展。还有别的出路吗?是否有适用于 ruby​​ 的 Mahout 或机器学习等价物?如果有,计算是如何进行的?

最佳答案

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

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

  2. 迄今为止最好的解决方案。请参阅下文了解更多说明。

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

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

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

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

我会推荐像 Sidekiq 这样的东西与雷迪斯。然后您可以将结果缓存在内存缓存中,或者您可以每次都重新计算结果,这实际上取决于您需要多久计算一次。但是,使用此解决方案,如果需要,设置稳定的缓存会容易得多。

在我工作的地方,我们有一个应用程序运行一些繁重的查询和大量这样的计算。每天晚上,这些作业都会排队,然后在接下来的几个小时内在隔离的服务器上运行。这可以很好地扩展,并且也很容易用新遗物进行监控。

希望这对您有所帮助并且有意义(我知道我的英语并不完美),但请随时询问我是否误解了什么或者您还有其他问题。

关于ruby-on-rails - 复杂算法应该在哪里进行计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16041354/

相关文章:

postgresql - 一批从 PostgreSQL 传输到 Redis 的数据有多少被认为是可靠的?

ruby-on-rails - ActiveRecord::HasManyThroughOrderError: 不能有 has_many :through 关联

python - 输入记录与 python mapreduce 中的输出记录不匹配

hadoop - Hadoop命令不起作用

database-design - 商业Web应用--可扩展的数据库设计

scala - 作为执行程序和线程数量的函数,spark中的分区数量是多少?

ruby-on-rails - 使用rails prawn时如何设置表格的column_width?

ruby-on-rails - 密码更新时出现未经授权的错误设计

css - 限制css中每行的字符数

linux - Hadoop Streaming 没有正确编码字符