我正在使用Mahout构建基于Item的Cf推荐引擎。 我创建了一个MahoutHelper类,它有一个构造函数:
public MahoutHelper(String serverName, String user, String password,
String DatabaseName, String tableName) {
source = new MysqlConnectionPoolDataSource();
source.setServerName(serverName);
source.setUser(user);
source.setPassword(password);
source.setDatabaseName(DatabaseName);
source.setCachePreparedStatements(true);
source.setCachePrepStmts(true);
source.setCacheResultSetMetadata(true);
source.setAlwaysSendSetIsolation(true);
source.setElideSetAutoCommits(true);
DBmodel = new MySQLJDBCDataModel(source, tableName, "userId", "itemId",
"value", null);
similarity = new TanimotoCoefficientSimilarity(DBmodel);
}
,建议的方法是:
public List<RecommendedItem> recommendation() throws TasteException {
Recommender recommender = null;
recommender = new GenericItemBasedRecommender(DBmodel, similarity);
List<RecommendedItem> recommendations = null;
recommendations = recommender.recommend(userId, maxNum);
System.out.println("query completed");
return recommendations;
}
它正在使用数据源来构建数据模型,但问题是,当mysql只有少量数据(小于100)时,程序对我来说很好,而当规模变为超过1,000,000时,程序堆栈在做推荐和永远不会前进。我不知道它是怎么发生的。顺便说一句,我使用相同的数据来构建带有.dat文件的FileDataModel,完成分析只需2~3秒。我很困惑。
答案 0 :(得分:2)
直接使用数据库只适用于微小的数据集,例如十万个数据点。除此之外,此类数据密集型应用程序的开销永远不会快速运行;查询需要数千个SQL查询或更多。
相反,您必须加载并重新加载到内存中。你仍然可以从数据库中取出;将ReloadFromJDBCDataModel
视为包装器。