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