我們已制訂了以下系統:
沒有用戶的:〜500K
沒有項目的:〜100KMahout的優化:多線程TopItems.getTopUsers()和TopItems.getTopItems()
UserSimilarity userSimilarity = new TanimotoCoefficientSimilarity(dataModel);
UserNeighborhood neighborhood = new NearestNUserNeighborhood(neighborHoodSize,userSimilarity, dataModel);
GenericBooleanPrefUserBasedRecommender recommender = new GenericBooleanPrefUserBasedRecommender(dataModel, neighborhood ,userSimilarity);
有了上面的推薦人,我們得到了一個響應時間,平均爲600ms爲400個社區大小。
我們試圖做它對小於100ms(在線引擎)和我們做了通過使用自定義TopItems.getTopUsers()和TopItems.getTopItems()多線程(等於沒有核心)函數實現這一目標。採取的職能平均時間
TopUsers():〜30-40毫秒
TopItems():〜50-60毫秒
然而,當我們試圖讓許多併發請求(甚至到了25階),響應時間最高可達秒。
我們可以爲每個用戶預先計算鄰居之類的東西,但TopItems()仍然是併發請求的明確瓶頸。
你會提出任何方式來提高多線程併發請求的響應時間嗎?
回退選項將存儲預先計算的建議在一些NoSql數據庫。 即使對於不那麼活躍的用戶,我們也會定期進行預先計算,這將會非常昂貴。我們可能比不活躍的用戶更頻繁地選擇活躍用戶和預計算建議。
有什麼想法?
感謝肖恩提到矩陣分解。看起來它在個性化方面更加強大。 – user2572019