Mahout 0.7使用MysqlJdbcDataModel无法获得大数据的推荐

时间:2012-08-27 03:40:08

标签: mysql mahout

我正在使用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秒。我很困惑。

1 个答案:

答案 0 :(得分:2)

直接使用数据库只适用于微小的数据集,例如十万个数据点。除此之外,此类数据密集型应用程序的开销永远不会快速运行;查询需要数千个SQL查询或更多。

相反,您必须加载并重新加载到内存中。你仍然可以从数据库中取出;将ReloadFromJDBCDataModel视为包装器。