You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@mahout.apache.org by "Sean Owen (JIRA)" <ji...@apache.org> on 2010/01/15 01:40:55 UTC
[jira] Resolved: (MAHOUT-247) GenericUserBasedRecommender.recommend
causes connection leak when called for user with no preferences
[ https://issues.apache.org/jira/browse/MAHOUT-247?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Sean Owen resolved MAHOUT-247.
------------------------------
Resolution: Fixed
Tentatively resolving this after applying a fix to the most obvious case where this issue could come up. It's not truly fixed in all cases, though at the moment, I think this is all that is practical to attempt. I'm open to more suggestions about how to address this.
> GenericUserBasedRecommender.recommend causes connection leak when called for user with no preferences
> -----------------------------------------------------------------------------------------------------
>
> Key: MAHOUT-247
> URL: https://issues.apache.org/jira/browse/MAHOUT-247
> Project: Mahout
> Issue Type: Bug
> Components: Collaborative Filtering
> Affects Versions: 0.2
> Environment: Reproducable on Win32 and Ubuntu
> Reporter: Tolga Oral
> Assignee: Sean Owen
> Priority: Minor
> Fix For: 0.3
>
>
> UserSimilarity userSimilarity = new TanimotoCoefficientSimilarity(getBooleanPrefDataModel());
> UserNeighborhood neighborhood = new NearestNUserNeighborhood(3, userSimilarity, getBooleanPrefDataModel());
> Recommender recommender = new GenericBooleanPrefUserBasedRecommender(getBooleanPrefDataModel(), neighborhood, userSimilarity);
> recommender.recommend(userwithnopreferencesdata, 10);
> code properly throws NoSuchUserException however one of the connections is hang on LongPrimitiveIterator backed by org.apache.mahout.cf.taste.impl.model.jdbc.AbstractJDBCDataModel$ResultSetIDIterator as Exception is thrown before TopItems.getTopUsers finishes the while loop
> public static long[] getTopUsers(int howMany,
> LongPrimitiveIterator allUserIDs,
> Rescorer<Long> rescorer,
> Estimator<Long> estimator) throws TasteException {
> Queue<SimilarUser> topUsers = new PriorityQueue<SimilarUser>(howMany + 1, Collections.reverseOrder());
> boolean full = false;
> double lowestTopValue = Double.NEGATIVE_INFINITY;
> //HERE IS THE ITERATOR
> while (allUserIDs.hasNext()) {
> long userID = allUserIDs.next();
> if (rescorer != null && rescorer.isFiltered(userID)) {
> continue;
> }
> //EXCEPTION THROWN HERE CAUSES THE CONNECTION LEAK
> double similarity = estimator.estimate(userID);
> double rescoredSimilarity = rescorer == null ? similarity : rescorer.rescore(userID, similarity);
> if (!Double.isNaN(rescoredSimilarity) && (!full || rescoredSimilarity > lowestTopValue)) {
> topUsers.add(new SimilarUser(userID, similarity));
> if (full) {
> topUsers.poll();
> } else if (topUsers.size() > howMany) {
> full = true;
> topUsers.poll();
> }
> lowestTopValue = topUsers.peek().getSimilarity();
> }
> }
> if (topUsers.isEmpty()) {
> return NO_IDS;
> }
> List<SimilarUser> sorted = new ArrayList<SimilarUser>(topUsers.size());
> sorted.addAll(topUsers);
> Collections.sort(sorted);
> long[] result = new long[sorted.size()];
> int i = 0;
> for (SimilarUser similarUser : sorted) {
> result[i++] = similarUser.getUserID();
> }
> return result;
> }
> ============================================================================================================
> I currently fixed it in our application by checking first to see if user has preferences for the given dataset (user might exists and have preferences for a different dataset).
> However this edge case does not cause issues in some other recommenders as long as we handle the NoSuchUserException.
> Easy solution is to use AbstractJDBCDataModel$ResultSetIDIterator always with try/catch/finally and release the connection.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.