1

私は Mahout を使用して、Item ベースの Cf レコメンデーション エンジンを構築しています。コンストラクタを持つ MahoutHelper クラスを作成します。

    public MahoutHelper(String serverName, String user, String password,
        String DatabaseName, String tableName) {


    source = new MysqlConnectionPoolDataSource();

    source.setServerName(serverName);
    source.setUser(user);
    source.setPassword(password);
    source.setDatabaseName(DatabaseName);
    source.setCachePreparedStatements(true);
    source.setCachePrepStmts(true);
    source.setCacheResultSetMetadata(true);
    source.setAlwaysSendSetIsolation(true);
    source.setElideSetAutoCommits(true);
    DBmodel = new MySQLJDBCDataModel(source, tableName, "userId", "itemId",
            "value", null);

    similarity = new TanimotoCoefficientSimilarity(DBmodel);

}

推奨される方法は次のとおりです。

   public List<RecommendedItem> recommendation() throws TasteException {

    Recommender recommender = null;
    recommender = new GenericItemBasedRecommender(DBmodel, similarity);
    List<RecommendedItem> recommendations = null;
    recommendations = recommender.recommend(userId, maxNum);
    System.out.println("query completed");
    return recommendations;
}

データソースを使用してデータモデルを構築していますが、問題は、mysql に少数のデータ (100 未満) しかない場合、プログラムは正常に動作しますが、スケールが 1,000,000 を超えると、プログラムは推奨を行うことでスタックし、決して先に進みません。 . 私はそれがどのように起こるか分かりません。ちなみに、同じデータを使用して .dat ファイルを使用して FileDataModel を構築したところ、分析が完了するまでに 2 ~ 3 秒しかかかりませんでした。私は混乱しています。

4

1 に答える 1

2

データベースを直接使用すると、10 万個のデータ ポイントなど、小さなデータ セットに対してのみ機能します。それを超えると、このようなデータ集約型アプリケーションのオーバーヘッドがすぐに実行されることはありません。クエリには、数千またはそれ以上の SQL クエリが必要です。

代わりに、メモリにロードして再ロードする必要があります。データベースから引き続きプルできます。ReloadFromJDBCDataModelラッパーとして見てください。

于 2012-08-27T10:57:19.007 に答える