2013-07-17 47 views
0

我一直在亨利馬烏致力於打造基於以下數據的推薦引擎:Mahout的建議性能問題

  • 100K用戶
  • 10K項目
  • 4M評級

我m使用以下JVM參數在Tomcat上運行它:

-Xms1024M -Xmx1024M -da -dsa -XX:NewRatio=9 -server 

建議花了大概6s,看起來很慢!我怎樣才能提高Mahout的表演?

我用下面的代碼:

這部分是在啓動時運行一次:

JDBCDataModel jdbcdatamodel = new MySQLJDBCDataModel(dataSource); 
dataModel = new ReloadFromJDBCDataModel(jdbcdatamodel); 

ItemSimilarity similarity = new CachingItemSimilarity(new EuclideanDistanceSimilarity(model), model); 
SamplingCandidateItemsStrategy strategy = new SamplingCandidateItemsStrategy(10, 5); 
recommender = new CachingRecommender(new GenericItemBasedRecommender(model, similarity, strategy, strategy)); 

而且,對於每一個用戶請求我做的:

recommender.recommend(userId, howMany); 
+0

瓶頸是數據庫訪問 –

+1

@JulianOrtega'ReloadFromJDBCDataModel'從數據庫加載數據模型到內存,所以這隻需要一次,或者我失去了一些東西? – Thibaud

+0

那麼,因爲你實際上沒有分享產生推薦的代碼,所以我不得不猜測 –

回答

1

我會建議一種不同的方法。使用夜間工作,爲所有用戶預先計算建議,並將結果每晚加載到MySQL表中。這將使顯示建議無非是一個簡單的數據庫調用。

既然您有10K項目,爲了計算單個用戶的推薦,mahout必須在內部將(10k x 10k)矩陣乘以另一個(10k x 1)矩陣。考慮到尺寸,6秒似乎相當快。 Reference

現在,如果您在hadoop和AWS EMR上使用RecommenderJob,則需要約10分鐘來處理您的規模上的數據。或者,您可以通過簡單地使用循環並按順序對所有用戶進行預先計算,以非分散方式完成相同的工作。缺點是你的建議總是落後1天或6小時,或者你選擇工作的頻率。