2011-11-23 7 views
8

私はここ数日、Mahoutと協力して、推奨エンジンを作成しようとしています。私は今我々が持っているフルセットの1/3を試しています Apache Mahoutパフォーマンスの問題

  • 12Mのユーザー
  • 2M項目
  • 18Mユーザー項目ブール勧告
  • :私が働いている プロジェクトには、次のようなデータを持っています(すなわち、18Mの勧告のうち6M)。私が試したどんな構成でも、Mahoutは非常に残念な結果を出していました。いくつかの勧告は1.5秒かかり、他の勧告は1分以上かかりました。私は推薦のための合理的な時間は100msの時間枠の周りにあるべきだと思います。

    なぜ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); 
    

    答えて

    4

    、私たちは私の問題への解決策を発見しました。このソリューションに関連するコードはすべてMahout 0.6にコミットされました。詳細は対応するJIRA ticketに記載されています。

    VisualVMを使用すると、パフォーマンスのボトルネックがアイテムアイテムの類似性の計算にあることがわかりました。これは、非常にシンプルで効果的な修正を使用して@Seanによって対処されました(詳細はSVN commitを参照してください)。

    また、サンプリングレートを細かく制御できるようにSamplingCandidateItemsStrategyを改善する方法についても説明しました。

    最後に、上記の修正を加えてアプリケーションでいくつかのテストを行いました。圧倒的多数が500ms未満を取って、すべての推奨事項は1.5秒以下で完了しました。 Mahoutは毎秒100件の推奨事項を簡単に処理できました(それ以上のことを強調することはありませんでした)。

    2

    小提案:あなたの最後のスニペットはGenericBooleanPrefItemBasedRecommenderを使用する必要があります。

    データセットについては、アイテムベースのアルゴリズムが最適である必要があります。

    これは少し遅く聞こえ、分は長すぎます。原因は塊状のデータです。ユーザーが提供した評価の数に応じて時間を調整することができます。

    SamplingCandidateItemsStrategyをご覧ください。これにより、特に密集したデータに直面してサンプリングすることによって、この点で行われる作業量を制限することができます。これをデフォルトの代わりにGenericBooleanPrefItemBasedRecommenderに接続することができます。私はこれがあなたにスピードを上げ、応答時間をより予測可能にするレバーを与えると思います。

    +0

    Thnx Sean。私はあなたの提案を次のコードhttp://pastebin.com/XiuJvRhaで試してみました。しかし、パフォーマンスはまだ良くありません。 6Mセット(実際のセットの1/3)でも、推奨事項は3〜15秒かかります。あなたは何からそれを作るのですか? –

    +0

    Ok - もう少しテストしましたが、1-2の推奨事項を作成したユーザーの方が約400msですばらしいとわかりましたが、10または20の推奨事項を作成したユーザーの方がはるかに多くの時間がかかります。 28の推奨事項を持つ1人のユーザーが完了するまでに1分かかりました。 –

    +0

    SamplingCandidateItemsStrategyで値を調整する必要があります。例えば(10,5)を試してみてください。これはまだかなり遅く聞こえますが、かなり良いようです。キャッシュはあらかじめ計算された類似性で満たされるので、ある程度のウォームアップがあります。それが要因かどうかは分かりません。 –

    関連する問題