在过去的几天中,我一直在与Mahout合作,以创建推荐引擎。
我正在处理的项目具有以下数据:
我现在正在尝试使用我们所拥有全套产品的1/3(即1800万个建议中的600万个)。在我尝试的任何配置下,Mahout都提供了令人失望的结果。一些建议花了1.5秒,而另一些花了一分钟。我认为建议的合理时间应该在100毫秒左右。
Mahout为什么工作这么慢?
我正在使用以下JVM参数在Tomcat上运行应用程序(即使添加它们并没有多大区别):
-Xms4096M -Xmx4096M -da -dsa -XX:NewRatio=9 -XX:+UseParallelGC -XX:+UseParallelOldGC
以下是我的实验的代码段:
用户相似度1:
DataModel model = new FileDataModel(new File(dataFile));
UserSimilarity similarity = new CachingUserSimilarity(new LogLikelihoodSimilarity(model), model);
UserNeighborhood neighborhood = new NearestNUserNeighborhood(10, Double.NEGATIVE_INFINITY, similarity, model, 0.5);
recommender = new GenericBooleanPrefUserBasedRecommender(model, neighborhood, similarity);
用户相似度2:
DataModel model = new FileDataModel(new File(dataFile));
UserSimilarity similarity = new CachingUserSimilarity(new LogLikelihoodSimilarity(model), model);
UserNeighborhood neighborhood = new CachingUserNeighborhood(new NearestNUserNeighborhood(10, similarity, model), model);
recommender = new GenericBooleanPrefUserBasedRecommender(model, neighborhood, similarity);
项目相似度1:
DataModel dataModel = new FileDataModel(new File(dataFile));
ItemSimilarity itemSimilarity = new LogLikelihoodSimilarity(dataModel);
recommender = new GenericItemBasedRecommender(dataModel, itemSimilarity);
最佳答案
在Mahout社区的邮件列表的慷慨帮助下,我们找到了解决我的问题的方法。与解决方案有关的所有代码都提交给Mahout 0.6。可以在相应的JIRA ticket中找到更多详细信息。
使用VisualVM,我发现性能瓶颈在于项目-项目相似度的计算中。 @Sean使用非常简单但有效的修复方法解决了此问题(有关更多详细信息,请参见SVN commit)
此外,我们已经讨论了如何改进SamplingCandidateItemsStrategy以便更好地控制采样率。
最后,使用上述修复程序对我的应用程序进行了一些测试。所有建议均用时不到1.5秒,绝大多数建议用时不到500毫秒。 Mahout每秒可以轻松处理100条建议(我没有试图强调它多于此)。
关于performance - Apache Mahout性能问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8240383/