如何让Mahout推荐器更快地工作?

mak*_*ni4 2 apache hadoop mahout

所以你好Mahout社区!

关于加快推荐计算,我有几个问题.在我的服务器上,我安装了没有Hadoop的Mahout.jRuby也用于推荐脚本.在数据库中,我有3k用户和100k项(连接表中的270k项).因此,当用户请求建议时,简单脚本开始工作:

首先,它使用PGPoolingDataSource如下方式建立数据库连接:

  connection = org.postgresql.ds.PGPoolingDataSource.new()
  connection.setDataSourceName("db_name");
  connection.setServerName("localhost")
  connection.setPortNumber(5432)
  connection.setDatabaseName("db_name")
  connection.setUser("mahout")
  connection.setPassword("password")
  connection.setMaxConnections(100)
  connection
Run Code Online (Sandbox Code Playgroud)

我收到这个警告:

WARNING: You are not using ConnectionPoolDataSource. Make sure your DataSource pools connections to the database itself, or database performance will be severely reduced.
Run Code Online (Sandbox Code Playgroud)

任何想法如何解决?

之后我创建了建议:

model = PostgreSQLJDBCDataModel.new(
    connection,
    'stars',
    'user_id',
    'repo_id',
    'preference',
    'created_at'
  )

  similarity = TanimotoCoefficientSimilarity.new(model)
  neighborhood = NearestNUserNeighborhood.new(5, similarity, model)
  recommender = GenericBooleanPrefUserBasedRecommender.new(model, neighborhood, similarity)
  recommendations = recommender.recommend user_id, 30
Run Code Online (Sandbox Code Playgroud)

目前,为一个用户生成推荐需要大约5-10秒.问题是如何更快地提出建议(200ms会很好)?

Sea*_*wen 7

如果您知道正在使用池化数据源,则可以忽略该警告.这意味着实现没有实现池实现的通常接口ConnectionPoolDataSource.

如果试图直接从数据库运行,你永远不会让这个运行得快.数据访问太多了.换JDBCDataModelReloadFromJDBCDataModel并将其缓存在内存中,这应该可以正常工作,速度提高100倍.