1

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

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

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

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

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

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

4

1 回答 1

2

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

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

  2. 迄今为止最好的解决方案。有关更多说明,请参见下文。

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

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

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

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

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

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

希望这会有所帮助,并且有意义(我知道我的英语并不完美),但请随时询问我是否误解了某些内容或您有更多问题。

于 2013-06-19T08:47:09.443 回答