2012-10-22 5 views
2

Salut communauté Mahout à SO!Comment faire en sorte que Mahout recommender fonctionne plus vite?

J'ai quelques questions sur l'accélération des calculs de recommandation. Sur mon serveur, Mahout est installé sans Hadoop. JRuby est également utilisé pour le script de recommandation. Dans la base de données j'ai 3k utilisateurs et 100k éléments (270k éléments dans la table de jointure). Ainsi, lorsque l'utilisateur demande des recommandations du script simple commence son travail:

D'abord, il établit une connexion db en utilisant PGPoolingDataSource comme ceci:

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 

Je reçois cet avertissement:

WARNING: You are not using ConnectionPoolDataSource. Make sure your DataSource pools connections to the database itself, or database performance will be severely reduced. 

Toute idée comment fixer cette?

Après je crée des recommandations:

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 

Pour l'instant, il faut environ 5-10 secondes pour générer recommandation pour un utilisateur. La question est comment faire des recommandations plus rapidement (200ms serait bien)?

Répondre

7

Si vous savez que vous utilisez une source de données de regroupement, vous pouvez ignorer l'avertissement. Cela signifie que l'implémentation n'implémente pas l'interface habituelle pour mettre en œuvre les implémentations, ConnectionPoolDataSource.

Vous ne ferez jamais cette exécution rapide si vous essayez de courir directement d'une base de données. Il y a trop d'accès aux données. Enveloppez le JDBCDataModel dans ReloadFromJDBCDataModel et il sera mis en cache en mémoire, ce qui devrait fonctionner, littéralement, 100x plus vite.

+1

Sean, j'espérais obtenir votre réponse, merci beaucoup - ReloadFromJDBCDataModel était exactement ce dont j'avais besoin. Sans recharger cela prend 8 secondes pour un utilisateur et avec recharger j'ai traité 119 utilisateurs en 18 sec. Il est 53x accélérer! – makaroni4

Questions connexes