Author: ssc
Date: Tue Jul 10 15:16:47 2012
New Revision: 1359722

URL: http://svn.apache.org/viewvc?rev=1359722&view=rev
Log:
MAHOUT-1042 Hotspot in RecommenderJob-PartialMultiplyMapper-Reducer

Modified:
    
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/hadoop/item/AggregateAndRecommendReducer.java
    
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/hadoop/item/RecommenderJob.java
    
mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/hadoop/item/RecommenderJobTest.java
    mahout/trunk/math/src/main/java/org/apache/mahout/math/AbstractVector.java

Modified: 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/hadoop/item/AggregateAndRecommendReducer.java
URL: 
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/hadoop/item/AggregateAndRecommendReducer.java?rev=1359722&r1=1359721&r2=1359722&view=diff
==============================================================================
--- 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/hadoop/item/AggregateAndRecommendReducer.java
 (original)
+++ 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/hadoop/item/AggregateAndRecommendReducer.java
 Tue Jul 10 15:16:47 2012
@@ -33,6 +33,7 @@ import org.apache.mahout.math.RandomAcce
 import org.apache.mahout.math.VarLongWritable;
 import org.apache.mahout.math.Vector;
 import org.apache.mahout.math.function.DoubleFunction;
+import org.apache.mahout.math.function.Functions;
 import org.apache.mahout.math.map.OpenIntLongHashMap;
 
 import java.io.IOException;
@@ -122,13 +123,12 @@ public final class AggregateAndRecommend
     /* having boolean data, each estimated preference can only be 1,
      * however we can't use this to rank the recommended items,
      * so we use the sum of similarities for that. */
-    Vector predictionVector = null;
-    for (PrefAndSimilarityColumnWritable prefAndSimilarityColumn : values) {
-      predictionVector = predictionVector == null
-          ? prefAndSimilarityColumn.getSimilarityColumn()
-          : 
predictionVector.plus(prefAndSimilarityColumn.getSimilarityColumn());
+    Iterator<PrefAndSimilarityColumnWritable> columns = values.iterator();
+    Vector predictions = columns.next().getSimilarityColumn();
+    while (columns.hasNext()) {
+      predictions.assign(columns.next().getSimilarityColumn(), Functions.PLUS);
     }
-    writeRecommendedItems(userID, predictionVector, context);
+    writeRecommendedItems(userID, predictions, context);
   }
 
   private void reduceNonBooleanData(VarLongWritable userID,
@@ -151,12 +151,25 @@ public final class AggregateAndRecommend
         numberOfSimilarItemsUsed.setQuick(itemIDIndex, 
numberOfSimilarItemsUsed.getQuick(itemIDIndex) + 1);
       }
 
-      numerators = numerators == null
-          ? prefValue == BOOLEAN_PREF_VALUE ? simColumn.clone() : 
simColumn.times(prefValue)
-          : numerators.plus(prefValue == BOOLEAN_PREF_VALUE ? simColumn : 
simColumn.times(prefValue));
+      if (denominators == null) {
+        denominators = simColumn.clone();
+      } else {
+        denominators.assign(simColumn, Functions.PLUS_ABS);
+      }
+
+      if (numerators == null) {
+        numerators = simColumn.clone();
+        if (prefValue != BOOLEAN_PREF_VALUE) {
+          numerators.assign(Functions.MULT, prefValue);
+        }
+      } else {
+        Vector toAdd = simColumn;
+        if (prefValue != BOOLEAN_PREF_VALUE) {
+          toAdd.assign(Functions.MULT, prefValue);
+        }
+        numerators.assign(toAdd, Functions.PLUS);
+      }
 
-      simColumn.assign(ABSOLUTE_VALUES);
-      denominators = denominators == null ? simColumn : 
denominators.plus(simColumn);
     }
 
     if (numerators == null) {

Modified: 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/hadoop/item/RecommenderJob.java
URL: 
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/hadoop/item/RecommenderJob.java?rev=1359722&r1=1359721&r2=1359722&view=diff
==============================================================================
--- 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/hadoop/item/RecommenderJob.java
 (original)
+++ 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/hadoop/item/RecommenderJob.java
 Tue Jul 10 15:16:47 2012
@@ -194,7 +194,6 @@ public final class RecommenderJob extend
       Job prePartialMultiply1 = prepareJob(
               similarityMatrixPath, prePartialMultiplyPath1, 
SequenceFileInputFormat.class,
               SimilarityMatrixRowWrapperMapper.class, VarIntWritable.class, 
VectorOrPrefWritable.class,
-              Reducer.class, VarIntWritable.class, VectorOrPrefWritable.class,
               SequenceFileOutputFormat.class);
       boolean succeeded = prePartialMultiply1.waitForCompletion(true);
       if (!succeeded) {
@@ -207,9 +206,6 @@ public final class RecommenderJob extend
                                            UserVectorSplitterMapper.class,
                                            VarIntWritable.class,
                                            VectorOrPrefWritable.class,
-                                           Reducer.class,
-                                           VarIntWritable.class,
-                                           VectorOrPrefWritable.class,
                                            SequenceFileOutputFormat.class);
       if (usersFile != null) {
         
prePartialMultiply2.getConfiguration().set(UserVectorSplitterMapper.USERS_FILE, 
usersFile);

Modified: 
mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/hadoop/item/RecommenderJobTest.java
URL: 
http://svn.apache.org/viewvc/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/hadoop/item/RecommenderJobTest.java?rev=1359722&r1=1359721&r2=1359722&view=diff
==============================================================================
--- 
mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/hadoop/item/RecommenderJobTest.java
 (original)
+++ 
mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/hadoop/item/RecommenderJobTest.java
 Tue Jul 10 15:16:47 2012
@@ -829,7 +829,7 @@ public class RecommenderJobTest extends 
    * check whether the explicit user/item filter works
    */
   @Test
-   public void testCompleteJobWithFiltering() throws Exception {
+  public void testCompleteJobWithFiltering() throws Exception {
 
      File inputFile = getTestTempFile("prefs.txt");
      File userFile = getTestTempFile("users.txt");

Modified: 
mahout/trunk/math/src/main/java/org/apache/mahout/math/AbstractVector.java
URL: 
http://svn.apache.org/viewvc/mahout/trunk/math/src/main/java/org/apache/mahout/math/AbstractVector.java?rev=1359722&r1=1359721&r2=1359722&view=diff
==============================================================================
--- mahout/trunk/math/src/main/java/org/apache/mahout/math/AbstractVector.java 
(original)
+++ mahout/trunk/math/src/main/java/org/apache/mahout/math/AbstractVector.java 
Tue Jul 10 15:16:47 2012
@@ -553,7 +553,7 @@ public abstract class AbstractVector imp
     }
 
     /* special case: we only need to iterate over the non-zero elements of the 
vector to add */
-    if (Functions.PLUS.equals(function)) {
+    if (Functions.PLUS.equals(function) || 
Functions.PLUS_ABS.equals(function)) {
       Iterator<Vector.Element> nonZeroElements = other.iterateNonZero();
       while (nonZeroElements.hasNext()) {
         Vector.Element e = nonZeroElements.next();


Reply via email to