Mahout 0.7 Не успя да получи препоръка с големи данни с помощта на MysqlJdbcDataModel

Използвам Mahout, за да изградя базиран на артикули двигател за препоръки 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, програмата се натрупва при извършване на препоръки и никога не продължава напред . Нямам идея как става. Между другото използвах същите данни, за да създам FileDataModel с .dat файл и отнема само 2~3 секунди за завършване на анализа. Объркан съм.


person qian qian    schedule 27.08.2012    source източник


Отговори (1)


Директното използване на базата данни ще работи само за малки набори от данни, като може би сто хиляди точки от данни. Освен това режийните разходи на такива интензивни приложения никога няма да работят бързо; една заявка отнема хиляди SQL заявки или повече.

Вместо това трябва да зареждате и презареждате в паметта. Все още можете да изтеглите от базата данни; погледнете ReloadFromJDBCDataModel като обвивка.

person Sean Owen    schedule 27.08.2012
comment
Благодаря ти много. Това помогна. - person Omer Sonmez; 18.01.2014