You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mahout.apache.org by sr...@apache.org on 2009/07/22 13:14:13 UTC

svn commit: r796668 - in /lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model: GenericBooleanUserDataModel.java GenericDataModel.java

Author: srowen
Date: Wed Jul 22 11:14:13 2009
New Revision: 796668

URL: http://svn.apache.org/viewvc?rev=796668&view=rev
Log:
Performance optimizations -- use Fast data structures and rehash to flush garbage before use

Modified:
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericBooleanUserDataModel.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericDataModel.java

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericBooleanUserDataModel.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericBooleanUserDataModel.java?rev=796668&r1=796667&r2=796668&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericBooleanUserDataModel.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericBooleanUserDataModel.java Wed Jul 22 11:14:13 2009
@@ -22,6 +22,7 @@
 import org.apache.mahout.cf.taste.common.Refreshable;
 import org.apache.mahout.cf.taste.common.TasteException;
 import org.apache.mahout.cf.taste.impl.common.FastMap;
+import org.apache.mahout.cf.taste.impl.common.FastSet;
 import org.apache.mahout.cf.taste.model.DataModel;
 import org.apache.mahout.cf.taste.model.Item;
 import org.apache.mahout.cf.taste.model.Preference;
@@ -33,7 +34,7 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
-import java.util.Map;
+import java.util.Set;
 
 /**
  * TODO many methods here have not been implemented properly yet
@@ -41,7 +42,7 @@
 public final class GenericBooleanUserDataModel implements DataModel, Serializable {
 
   private final List<User> users;
-  private final Map<Object, User> userMap;
+  private final FastMap<Object, User> userMap;
   private final Object[] itemIDs;
   //private final Set<Object> itemIDSet;
 
@@ -49,9 +50,9 @@
     if (users == null) {
       throw new IllegalArgumentException("users is null");
     }
-    this.users = new ArrayList<User>();
-    this.userMap = new FastMap<Object, User>();
-    List<Object> itemIDs = new ArrayList<Object>();
+    this.users = new ArrayList<User>(1003);
+    this.userMap = new FastMap<Object, User>(1003);
+    Set<Object> itemIDs = new FastSet<Object>(1003);
     for (User user : users) {
       if (!(user instanceof BooleanPrefUser)) {
         throw new IllegalArgumentException("Must use a source of BooleanPrefUsers");
@@ -60,6 +61,7 @@
       userMap.put(user.getID(), user);
       itemIDs.addAll(((BooleanPrefUser) user).getItemIDs());
     }
+    userMap.rehash();
     Collections.sort(this.users);
 
     this.itemIDs = itemIDs.toArray();

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericDataModel.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericDataModel.java?rev=796668&r1=796667&r2=796668&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericDataModel.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericDataModel.java Wed Jul 22 11:14:13 2009
@@ -54,10 +54,10 @@
   private static final Iterable<Preference> NO_PREFS_ITERABLE = new EmptyIterable<Preference>();
 
   private final List<User> users;
-  private final Map<Object, User> userMap;
+  private final FastMap<Object, User> userMap;
   private final List<Item> items;
-  private final Map<Object, Item> itemMap;
-  private final Map<Object, Preference[]> preferenceForItems;
+  private final FastMap<Object, Item> itemMap;
+  private final FastMap<Object, Preference[]> preferenceForItems;
 
   /**
    * <p>Creates a new {@link GenericDataModel} from the given {@link User}s (and their preferences). This {@link
@@ -75,7 +75,7 @@
     this.itemMap = new FastMap<Object, Item>();
     // I'm abusing generics a little here since I want to use this (huge) map to hold Lists,
     // then arrays, and don't want to allocate two Maps at once here.
-    Map<Object, Object> prefsForItems = new FastMap<Object, Object>();
+    FastMap<Object, Object> prefsForItems = new FastMap<Object, Object>();
     int currentCount = 0;
     for (User user : users) {
       userMap.put(user.getID(), user);
@@ -96,6 +96,8 @@
         log.info("Processed {} users", currentCount);
       }
     }
+    userMap.rehash();
+    itemMap.rehash();
 
     List<User> usersCopy = new ArrayList<User>(userMap.values());
     Collections.sort(usersCopy);
@@ -105,6 +107,7 @@
     Collections.sort(itemsCopy);
     this.items = Collections.unmodifiableList(itemsCopy);
 
+    prefsForItems.rehash();    
     // Swap out lists for arrays here -- using the same Map. This is why the generics mess is worth it.
     for (Map.Entry<Object, Object> entry : prefsForItems.entrySet()) {
       List<Preference> list = (List<Preference>) entry.getValue();
@@ -112,8 +115,9 @@
       Arrays.sort(prefsAsArray, ByUserPreferenceComparator.getInstance());
       entry.setValue(prefsAsArray);
     }
+
     // Yeah more generics ugliness
-    this.preferenceForItems = (Map<Object, Preference[]>) (Map<Object, ?>) prefsForItems;
+    this.preferenceForItems = (FastMap<Object, Preference[]>) (FastMap<Object, ?>) prefsForItems;
   }
 
   /**