mahout-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Tomasz Tretkowski" <>
Subject CachingUserSimilarity concurrency issue.
Date Sat, 26 Dec 2015 21:20:58 GMT
Hi all.

I am using GenericBooleanPrefItemBasedRecommender with Tanimoto similarity.
To improve performance I used CachingUserSimilarity (code below)

public Recommender buildRecommender(DataModel dataModel) throws TasteException {
        UserSimilarity similarity = new CachingUserSimilarity(new TanimotoCoefficientSimilarity(similarityDataModel),
        UserNeighborhood neighborhood = new NearestNUserNeighborhood(8, Double.NEGATIVE_INFINITY,
similarity, dataModel, 1.0);
        return new GenericBooleanPrefUserBasedRecommender(dataModel, neighborhood, similarity);

However when I ran load tests on my server then I found that only about two out of eight cpu
cores were utilized. The rest was waiting idle in
method. That is probably due to the fact that Cache.get method used in CachingUserSimilarity
looks like this:
public V get(K key) throws TasteException {
    V value;
    synchronized (cache) {
      value = cache.get(key);

Threads doing concurrent reads are blocking each other. I would expect standard double-checked
locking pattern there to avoid that if it is not necessary (i.e. there is a hit and the cache
is not modified).
Am I doing something wrong or there is a defect in Cache class?

 Tomasz Tretkowski

View raw message