Dan*_*har 8 performance recommendation-engine mahout
在过去的几天里,我一直在与Mahout合作,试图创建一个推荐引擎.我正在研究的项目有以下数据:
我现在正在试验我们拥有的全套的1/3(即18M建议中的6M).在我试过的任何配置中,Mahout都提供了相当令人失望的结果.一些建议需要1.5秒,而其他建议需要一分钟.我认为建议的合理时间应该在100毫秒左右.
Mahout为什么这么慢?
我正在使用以下JVM参数在Tomcat上运行应用程序(即使添加它们并没有太大的区别):
-Xms4096M -Xmx4096M -da -dsa -XX:NewRatio=9 -XX:+UseParallelGC -XX:+UseParallelOldGC
Run Code Online (Sandbox Code Playgroud)
以下是我的实验的代码段:
用户相似度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);
Run Code Online (Sandbox Code Playgroud)
用户相似度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);
Run Code Online (Sandbox Code Playgroud)
项目相似度1:
DataModel dataModel = new FileDataModel(new File(dataFile));
ItemSimilarity itemSimilarity = new LogLikelihoodSimilarity(dataModel);
recommender = new GenericItemBasedRecommender(dataModel, itemSimilarity);
Run Code Online (Sandbox Code Playgroud)
在 Mahout 社区通过其邮件列表的慷慨帮助下,我们找到了解决我的问题的方法。与该解决方案相关的所有代码都已提交到 Mahout 0.6 中。更多详细信息可以在相应的JIRA 票证中找到。
使用 VisualVM,我发现性能瓶颈在于项间相似度的计算。@Sean 使用一个非常简单但有效的修复解决了这个问题(有关更多详细信息,请参阅SVN 提交)
此外,我们还讨论了如何改进SamplingCandidateItemsStrategy以更好地控制采样率。
最后,我通过上述修复对我的应用程序进行了一些测试。所有建议花费的时间都不超过 1.5 秒,其中绝大多数花费的时间都不超过 500 毫秒。Mahout 每秒可以轻松处理 100 个建议(我并没有试图强调这一点)。