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