You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@labs.apache.org by ka...@apache.org on 2009/03/12 20:12:25 UTC

svn commit: r752975 - in /labs/bananadb/trunk: ./ src/main/java/org/apache/labs/bananadb/ src/main/java/org/apache/labs/bananadb/hashtable/ src/main/java/org/apache/labs/bananadb/index/ src/test/java/org/apache/labs/bananadb/demo/ src/test/java/org/apa...

Author: kalle
Date: Thu Mar 12 19:12:24 2009
New Revision: 752975

URL: http://svn.apache.org/viewvc?rev=752975&view=rev
Log:
BananaDB

package refactoring
benchmarks
documentation

Added:
    labs/bananadb/trunk/BENCHMARK.txt
    labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/
    labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/AbstractIndex.java
      - copied, changed from r748929, labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/AbstractIndex.java
    labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/Entity.java
      - copied, changed from r748929, labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/Entity.java
    labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/EntityCursor.java
      - copied, changed from r748929, labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/EntityCursor.java
    labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/EntityStore.java
      - copied, changed from r748929, labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/EntityStore.java
    labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/PrimaryIndex.java
      - copied, changed from r748929, labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/PrimaryIndex.java
    labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/PrimaryKey.java
      - copied, changed from r748929, labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/PrimaryKey.java
    labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/SecondaryIndex.java
      - copied, changed from r748929, labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/SecondaryIndex.java
    labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/SecondaryKey.java
      - copied, changed from r748929, labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/SecondaryKey.java
    labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/hashtable/Benchmark.java
Removed:
    labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/AbstractIndex.java
    labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/Entity.java
    labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/EntityCursor.java
    labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/EntityStore.java
    labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/PrimaryIndex.java
    labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/PrimaryKey.java
    labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/SecondaryIndex.java
    labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/SecondaryKey.java
Modified:
    labs/bananadb/trunk/README.txt
    labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/hashtable/Hashtable.java
    labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/demo/City.java
    labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/demo/Country.java
    labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/demo/EntityStore.java

Added: labs/bananadb/trunk/BENCHMARK.txt
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/BENCHMARK.txt?rev=752975&view=auto
==============================================================================
--- labs/bananadb/trunk/BENCHMARK.txt (added)
+++ labs/bananadb/trunk/BENCHMARK.txt Thu Mar 12 19:12:24 2009
@@ -0,0 +1,61 @@
+This benchmark is created with a Hashtable<Integer, String>
+where the String value was about 300 characters long
+using a single thread
+on a 2.4GHz Intel CPU
+and a rather slow 5200 RPM HDD.
+
+
+The output shows very clear that you should not fill a hashtable anywhere near the capacity
+and the results of doing so isn't strange at all: the entities will then need to share
+the same position in the hashtable and will thus require navigating the list of entites
+in order to be inserted or read.
+
+Thus I suspect peaking insert values are due to random keys with hash codes 
+that cluster large amount of entities at the same position in the hashtable.
+
+
+Capacity 8 times greater than number of items:
+
+capacity	items	random write ms/item	sequencial read ms/items	random read ms/item
+8000	1000	0.225	0.119	0.093
+12000	1500	0.208	0.102	0.085
+18000	2250	0.382	0.091	0.238
+27000	3375	0.243	0.095	0.128
+40496	5062	0.282	0.103	0.149
+60744	7593	0.322	0.098	0.173
+91112	11389	0.284	0.104	0.133
+136664	17083	0.555	0.116	0.226
+204992	25624	0.731	0.106	0.244
+307488	38436	1.015	0.077	0.252
+461232	57654	0.798	0.093	0.165
+691848	86481	2.449	0.071	0.298
+1037768	129721	0.493	0.115	0.090
+1556648	194581	2.515	0.089	0.167
+2334968	291871	1.788	0.073	0.121
+3502448	437806	0.834	0.088	0.085
+
+
+Capacity equal to number of items:
+
+capacity	items	random write ms/item	sequencial read ms/items	random read ms/item
+1000	1000	0.32	0.0902	0.164
+1500	1500	0.409	0.0747	0.263
+2250	2250	2.324	0.0675	1.682
+3375	3375	0.774	0.0695	0.620
+5062	5062	1.030	0.0684	0.818
+7593	7593	1.736	0.0706	1.030
+11389	11389	1.311	0.0692	0.582
+17083	17083	3.106	0.0707	1.277
+25624	25624	4.646	0.0712	1.418
+38436	38436	6.903	0.0657	1.511
+57654	57654	5.118	0.0664	0.822
+86481	86481	14.944	0.0647	1.660
+129721	129721	1.605	0.0861	0.169
+
+And then I gave up waiting.. The numbers are rather linear though, compare add see for your self.
+
+The test was made using class o.a.l.b.hashtable.Benchmark
+
+
+
+kalle@apache.org
\ No newline at end of file

Modified: labs/bananadb/trunk/README.txt
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/README.txt?rev=752975&r1=752974&r2=752975&view=diff
==============================================================================
--- labs/bananadb/trunk/README.txt (original)
+++ labs/bananadb/trunk/README.txt Thu Mar 12 19:12:24 2009
@@ -1,5 +1,7 @@
-This is BananaDB, a hashtable (Map<K, V>) located on filesystem and *not* in memory.
+This is BananaDB, a Hashtable<K, V> located on filesystem and *not* in memory.
 
-The aim is to add transactions, secondary indices and a top level annotation API. An abstract API for this is already available in the source folder, it is however only the hashtable code that works.
+The aim is to add transactions, secondary indices and a top level annotation API.
+An abstract API for this is already available in the source folder,
+it is however only the hashtable code that works.
 
 kalle@apache.org 

Modified: labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/hashtable/Hashtable.java
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/hashtable/Hashtable.java?rev=752975&r1=752974&r2=752975&view=diff
==============================================================================
--- labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/hashtable/Hashtable.java (original)
+++ labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/hashtable/Hashtable.java Thu Mar 12 19:12:24 2009
@@ -29,7 +29,7 @@
  * It is not thread safe.
  * It can not handle null keys.
  * It is limited to a maximum number of entries, defined when opening (formatting) the map.
- * The values can however be of any size.
+ * The entry values can however be of any size.
  * <p/>
  * It will need a entries partitioning scheme similar to the the data partitioning scheme
  * <p/>
@@ -123,12 +123,33 @@
 
   private List<HashtableAccessor> accessors = new ArrayList<HashtableAccessor>();
 
+  /**
+   * @param readOnly 
+   * @return A new accessor used to seek in the hashtable.
+   * @throws IOException
+   */
   public HashtableAccessor createAccessor(boolean readOnly) throws IOException {
     HashtableAccessor accessor = new HashtableAccessor(this, readOnly);
     accessors.add(accessor);
     return accessor;
   }
 
+  /**
+   * Open or create a hashtable.
+   *
+   * A hashtable that contains about the number of items as defined by parameter capacity
+   * will be about 8 times slower to access (random read and random write)
+   * than a hashtable with a capacity of 8 times greater than the number of entities it can store.
+   * This values seems to be rather linear.
+   *
+   * Milage might vary depending on distribution of key value hash codes.
+   *
+   * @param path Directory where hashtable data is stored. Only one hashtable can fit in this directory.
+   * @param capacity Maximum number of entites that fits this hashtable. This value is only valid when creating a new hashtable.
+   * @param keyClassHandler
+   * @param valueClassHandler
+   * @throws IOException
+   */
   public Hashtable(File path, int capacity, KeyClassHandler<K> keyClassHandler, EntityClassHandler<V> valueClassHandler) throws IOException {
 
     this.keyClassHandler = keyClassHandler;
@@ -208,7 +229,15 @@
 
   }
 
-  public V put(HashtableAccessor accessor, K key, V value) throws IOException {
+  /**
+   *
+   * @param accessor
+   * @param key
+   * @param value
+   * @return Previous value of the parameter key, or null if a new key.
+   * @throws IOException
+   */
+  public synchronized V put(HashtableAccessor accessor, K key, V value) throws IOException {
 
     // write key to buf
     ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
@@ -487,6 +516,9 @@
   }
 
 
+  /**
+   * Represents an entity value data partition file. 
+   */
   public class Partition {
 
     private int partitionNumber;
@@ -681,6 +713,20 @@
     };
   }
 
+  /**
+   * A Cursor iterates the entities in a Hashtable.
+   *
+   * It is NOT thread safe! I.e. you can not use multiple threads to iterate the
+   * same cursor at the same time.
+   *
+   * The entities are returned close to the order of the hash code, but not always.
+   * The greater the capacity of a hashtable the more precise the order.
+   *
+   * If another accessor is adding a new entity to the hashtable and the cursor already have
+   * iterated passed the hash code of the new entity key, this item will not be iterated,
+   * however if the hash code of the new entity key is greater than the current entity key
+   * in the cursor the new entity will most probably be iterated.
+   */
   public class Cursor {
 
     private HashtableAccessor accessor;
@@ -695,6 +741,11 @@
     private K key;
     private V value;
 
+    /**
+     * Attempts to move the curors one step forward.
+     * @return true if cursor moved to next entry, false if no more entries.
+     * @throws IOException
+     */
     public boolean next() throws IOException {
       if (entryCursor != -1) {
         accessor.getEntriesRAF().seek(entryCursor);

Copied: labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/AbstractIndex.java (from r748929, labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/AbstractIndex.java)
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/AbstractIndex.java?p2=labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/AbstractIndex.java&p1=labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/AbstractIndex.java&r1=748929&r2=752975&rev=752975&view=diff
==============================================================================
--- labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/AbstractIndex.java (original)
+++ labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/AbstractIndex.java Thu Mar 12 19:12:24 2009
@@ -1,4 +1,4 @@
-package org.apache.labs.bananadb;
+package org.apache.labs.bananadb.index;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more

Copied: labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/Entity.java (from r748929, labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/Entity.java)
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/Entity.java?p2=labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/Entity.java&p1=labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/Entity.java&r1=748929&r2=752975&rev=752975&view=diff
==============================================================================
--- labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/Entity.java (original)
+++ labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/Entity.java Thu Mar 12 19:12:24 2009
@@ -1,4 +1,4 @@
-package org.apache.labs.bananadb;
+package org.apache.labs.bananadb.index;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more

Copied: labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/EntityCursor.java (from r748929, labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/EntityCursor.java)
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/EntityCursor.java?p2=labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/EntityCursor.java&p1=labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/EntityCursor.java&r1=748929&r2=752975&rev=752975&view=diff
==============================================================================
--- labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/EntityCursor.java (original)
+++ labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/EntityCursor.java Thu Mar 12 19:12:24 2009
@@ -1,4 +1,4 @@
-package org.apache.labs.bananadb;
+package org.apache.labs.bananadb.index;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more

Copied: labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/EntityStore.java (from r748929, labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/EntityStore.java)
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/EntityStore.java?p2=labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/EntityStore.java&p1=labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/EntityStore.java&r1=748929&r2=752975&rev=752975&view=diff
==============================================================================
--- labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/EntityStore.java (original)
+++ labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/EntityStore.java Thu Mar 12 19:12:24 2009
@@ -1,4 +1,4 @@
-package org.apache.labs.bananadb;
+package org.apache.labs.bananadb.index;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more

Copied: labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/PrimaryIndex.java (from r748929, labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/PrimaryIndex.java)
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/PrimaryIndex.java?p2=labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/PrimaryIndex.java&p1=labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/PrimaryIndex.java&r1=748929&r2=752975&rev=752975&view=diff
==============================================================================
--- labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/PrimaryIndex.java (original)
+++ labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/PrimaryIndex.java Thu Mar 12 19:12:24 2009
@@ -1,4 +1,4 @@
-package org.apache.labs.bananadb;
+package org.apache.labs.bananadb.index;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more

Copied: labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/PrimaryKey.java (from r748929, labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/PrimaryKey.java)
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/PrimaryKey.java?p2=labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/PrimaryKey.java&p1=labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/PrimaryKey.java&r1=748929&r2=752975&rev=752975&view=diff
==============================================================================
--- labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/PrimaryKey.java (original)
+++ labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/PrimaryKey.java Thu Mar 12 19:12:24 2009
@@ -1,4 +1,4 @@
-package org.apache.labs.bananadb;
+package org.apache.labs.bananadb.index;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more

Copied: labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/SecondaryIndex.java (from r748929, labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/SecondaryIndex.java)
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/SecondaryIndex.java?p2=labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/SecondaryIndex.java&p1=labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/SecondaryIndex.java&r1=748929&r2=752975&rev=752975&view=diff
==============================================================================
--- labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/SecondaryIndex.java (original)
+++ labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/SecondaryIndex.java Thu Mar 12 19:12:24 2009
@@ -1,4 +1,4 @@
-package org.apache.labs.bananadb;
+package org.apache.labs.bananadb.index;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more

Copied: labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/SecondaryKey.java (from r748929, labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/SecondaryKey.java)
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/SecondaryKey.java?p2=labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/SecondaryKey.java&p1=labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/SecondaryKey.java&r1=748929&r2=752975&rev=752975&view=diff
==============================================================================
--- labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/SecondaryKey.java (original)
+++ labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/index/SecondaryKey.java Thu Mar 12 19:12:24 2009
@@ -1,4 +1,4 @@
-package org.apache.labs.bananadb;
+package org.apache.labs.bananadb.index;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more

Modified: labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/demo/City.java
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/demo/City.java?rev=752975&r1=752974&r2=752975&view=diff
==============================================================================
--- labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/demo/City.java (original)
+++ labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/demo/City.java Thu Mar 12 19:12:24 2009
@@ -18,8 +18,8 @@
  */
 
 
-import org.apache.labs.bananadb.PrimaryKey;
-import org.apache.labs.bananadb.SecondaryKey;
+import org.apache.labs.bananadb.index.PrimaryKey;
+import org.apache.labs.bananadb.index.SecondaryKey;
 
 /**
  * User: kalle

Modified: labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/demo/Country.java
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/demo/Country.java?rev=752975&r1=752974&r2=752975&view=diff
==============================================================================
--- labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/demo/Country.java (original)
+++ labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/demo/Country.java Thu Mar 12 19:12:24 2009
@@ -18,7 +18,7 @@
  */
 
 
-import org.apache.labs.bananadb.PrimaryKey;
+import org.apache.labs.bananadb.index.PrimaryKey;
 
 /**
  * User: kalle

Modified: labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/demo/EntityStore.java
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/demo/EntityStore.java?rev=752975&r1=752974&r2=752975&view=diff
==============================================================================
--- labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/demo/EntityStore.java (original)
+++ labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/demo/EntityStore.java Thu Mar 12 19:12:24 2009
@@ -18,15 +18,15 @@
  */
 
 
-import org.apache.labs.bananadb.PrimaryIndex;
-import org.apache.labs.bananadb.SecondaryIndex;
+import org.apache.labs.bananadb.index.PrimaryIndex;
+import org.apache.labs.bananadb.index.SecondaryIndex;
 
 /**
  * User: kalle
  * Date: 2008-jul-23
  * Time: 02:51:09
  */
-public class EntityStore extends org.apache.labs.bananadb.EntityStore {
+public class EntityStore extends org.apache.labs.bananadb.index.EntityStore {
 
     private PrimaryIndex<String, Country> countries;
     private PrimaryIndex<Long, City> cities;

Added: labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/hashtable/Benchmark.java
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/hashtable/Benchmark.java?rev=752975&view=auto
==============================================================================
--- labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/hashtable/Benchmark.java (added)
+++ labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/hashtable/Benchmark.java Thu Mar 12 19:12:24 2009
@@ -0,0 +1,168 @@
+package org.apache.labs.bananadb.hashtable;
+
+import junit.framework.TestCase;
+
+import java.io.IOException;
+import java.io.File;
+import java.util.*;
+
+import org.junit.Test;
+import org.apache.labs.bananadb.hashtable.handlers.IntegerHandler;
+import org.apache.labs.bananadb.hashtable.handlers.StringValueHandler;
+
+/**
+ * @author kalle
+ * @since 2009-mar-11 11:52:55
+ */
+public class Benchmark {
+
+  private Hashtable hashtable;
+  private int capacity;
+  private KeyClassHandler keyClassHandler;
+  private EntityClassHandler entityClassHandler;
+
+  public static void main(String[] args) throws Exception {
+
+    StringBuilder csv = new StringBuilder();
+    csv.append("capacity\titems\trandom write ms/item\tsequencial read ms/items\trandom read ms/item\n");
+
+    Benchmark benchmark = new Benchmark();
+
+    for (int capacityfactor = 1; capacityfactor <= 10; capacityfactor += 2) {
+      for (int items = 1000; items <= 1000000; items *= 1.5) {
+        benchmark.test(items, capacityfactor * items, csv);
+        System.out.println("-----");
+        System.out.println(csv.toString());
+        System.out.println("-----");
+        Runtime.getRuntime().gc();
+        Runtime.getRuntime().gc();        
+      }
+    }
+
+  }
+
+  public void test(int items, int capacity, StringBuilder csv) throws Exception {
+
+    this.capacity = capacity;
+
+    System.out.println("Benchmarking with capacity = " + capacity + ", items = " + items);
+
+    csv.append(String.valueOf(capacity));
+    csv.append("\t");
+    csv.append(String.valueOf(items));
+
+    keyClassHandler = new IntegerHandler();
+    entityClassHandler = new StringValueHandler();
+    hashtable = new Hashtable(new File("target/benchmark/" + System.currentTimeMillis()), capacity, keyClassHandler, entityClassHandler);
+
+
+    List<Integer> keys = new ArrayList<Integer>(items);
+    List<String> values = new ArrayList<String>(items);
+
+    Random random = new Random(0);
+    Set<Integer> used = new HashSet<Integer>();
+    while (used.size() < items) {
+      int key = random.nextInt();
+      if (used.add(key)) {
+        keys.add(key);
+        values.add(String.valueOf(key) + " a bit of text that makes the value consume a bit more bytes. a bit of text that makes the value consume a bit more bytes. a bit of text that makes the value consume a bit more bytes. a bit of text that makes the value consume a bit more bytes.");
+      }
+    }
+
+    write(keys, values, csv);
+    sequencialRead((int) 10000, csv);
+    randomRead((int) 10000, keys, csv);
+
+    csv.append("\n");
+
+
+  }
+
+  private void sequencialRead(int items, StringBuilder csv) throws IOException {
+    System.out.println("sequencial reading..");
+    HashtableAccessor accessor = hashtable.createAccessor(true);
+    Hashtable.Cursor cursor = hashtable.new Cursor(accessor);
+    Object value;
+    int cnt = 0;
+
+    // todo time
+    long ms = System.currentTimeMillis();
+    while (cnt < items) {
+      while (cursor.next() && ++cnt < items) ;
+      if (cnt < items) {
+        cursor = hashtable.new Cursor(accessor);
+      }
+    }
+    double millisSpent = System.currentTimeMillis() - ms;
+    double millisSpentPerItem = millisSpent / (double) items;
+    System.out.println("seqread: " + millisSpent + " millis spent. " + millisSpentPerItem + " millis per item");
+    // todo time
+
+    csv.append("\t");
+    csv.append(String.valueOf(millisSpentPerItem));
+
+
+    accessor.close();
+  }
+
+  private void randomRead(int items, List keys, StringBuilder csv) throws IOException {
+    System.out.println("random reading..");
+    HashtableAccessor accessor = hashtable.createAccessor(true);
+    Random random = new Random(0);
+
+    // todo time
+    long ms = System.currentTimeMillis();
+
+    for (int cnt = 0; cnt < items; cnt++) {
+      Object key = keys.get(random.nextInt(keys.size()));
+      Object value = hashtable.get(accessor, key);
+    }
+    double millisSpent = System.currentTimeMillis() - ms;
+    double millisSpentPerItem = millisSpent / (double) items;
+    System.out.println("randread: " + millisSpent + " millis spent. " + millisSpentPerItem + " millis per item");
+
+    csv.append("\t");
+    csv.append(String.valueOf(millisSpentPerItem));
+
+    // todo time
+
+    accessor.close();
+  }
+
+  private void write(List keys, List values, StringBuilder csv) throws IOException {
+    System.out.println("writing..");
+
+    HashtableAccessor accessor = hashtable.createAccessor(false);
+
+    Random random = new Random(0);
+    Set<Integer> used = new HashSet<Integer>(keys.size());
+    int[] itemOrder = new int[keys.size()];
+    int order;
+    for (int i = 0; i < itemOrder.length; i++) {
+      while (true) {
+        order = random.nextInt(itemOrder.length);
+        if (used.add(order)) {
+          itemOrder[i] = order;
+          break;
+        }
+      }
+    }
+
+    // todo time
+    long ms = System.currentTimeMillis();
+    for (int index : itemOrder) {
+      hashtable.put(accessor, keys.get(index), values.get(index));
+    }
+    double millisSpent = System.currentTimeMillis() - ms;
+    double millisSpentPerItem = millisSpent / (double) keys.size();
+    System.out.println("randwrite: " + millisSpent + " millis spent. " + millisSpentPerItem + " millis per item");
+
+    csv.append("\t");
+    csv.append(String.valueOf(millisSpentPerItem));
+
+    // todo time
+
+    accessor.close();
+  }
+
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@labs.apache.org
For additional commands, e-mail: commits-help@labs.apache.org