你好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
我收到了这个警告:
WARNING: You are not using ConnectionPoolDataSource. Make sure your DataSource pools connections to the database itself, or database performance will be severely reduced.
有任何想法如何解决这个问题?
之后我创建了建议:
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
现在,为一个用户生成推荐需要大约5-10秒。问题是如何更快地提出建议(200ms会很好)?
答案 0 :(得分:7)
如果您知道正在使用池化数据源,则可以忽略该警告。这意味着实现没有实现池实现的通常接口ConnectionPoolDataSource
。
如果尝试直接从数据库运行,你永远不会让这个运行得快。数据访问太多了。将JDBCDataModel
包裹在ReloadFromJDBCDataModel
中,它将被缓存在内存中,这应该可以正常工作,速度提高100倍。