Apache Mahout性能问题

Dan*_*har 8 performance recommendation-engine mahout

在过去的几天里,我一直在与Mahout合作,试图创建一个推荐引擎.我正在研究的项目有以下数据:

  • 12M用户
  • 2M项目
  • 18M用户项布尔建议
  • 我现在正在试验我们拥有的全套的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)

    Dan*_*har 4

    在 Mahout 社区通过其邮件列表的慷慨帮助下,我们找到了解决我的问题的方法。与该解决方案相关的所有代码都已提交到 Mahout 0.6 中。更多详细信息可以在相应的JIRA 票证中找到。

    使用 VisualVM,我发现性能瓶颈在于项间相似度的计算。@Sean 使用一个非常简单但有效的修复解决了这个问题(有关更多详细信息,请参阅SVN 提交)

    此外,我们还讨论了如何改进SamplingCandidateItemsStrategy以更好地控制采样率。

    最后,我通过上述修复对我的应用程序进行了一些测试。所有建议花费的时间都不超过 1.5 秒,其中绝大多数花费的时间都不超过 500 毫秒。Mahout 每秒可以轻松处理 100 个建议(我并没有试图强调这一点)。