我们有以下系统:
用户数量:~500k
项目数量:~100k
UserSimilarity userSimilarity = new TanimotoCoefficientSimilarity(dataModel);
UserNeighborhood neighborhood = new NearestNUserNeighborhood(neighborHoodSize,userSimilarity, dataModel);
GenericBooleanPrefUserBasedRecommender recommender = new GenericBooleanPrefUserBasedRecommender(dataModel, neighborhood ,userSimilarity);
使用上述推荐器,对于 400 个邻域大小,我们获得了平均 600 毫秒的响应时间。
我们尝试使其小于 100 毫秒(在线引擎),我们确实通过使用自定义TopItems.getTopUsers()和TopItems.getTopItems()多线程(等于核心数)函数实现了这一点。函数 TopUsers() 花费的平均时间
:~ 30-40 ms
TopItems():~ 50-60 ms
但是,当我们尝试发出许多并发请求(甚至达到 25 个)时,响应时间会飙升至几秒。
我们可以为每个用户预先计算类似邻域的东西,但 TopItems() 仍然是并发请求的明显瓶颈。
您会建议任何方法来改善多线程并发请求的响应时间吗?
后备选项是将预先计算的建议存储在一些 NoSql DB 中。这将不会很昂贵,因为我们会定期进行预计算,即使对于不那么活跃的用户也是如此。我们可能会比不那么活跃的用户更频繁地挑选活跃用户并预先计算推荐。
有什么想法吗?