Started a new thread since the old got a bit long, if you want to
catch up read the thread "The event framework has landed".

Okay, i changed the tests to reflect a bit more realistic usage.

The tests first inserts 1M entries to create a base of data. After
that it makes reads and writes 1000 entries a thousand times.

BabuDB:
First million: 4s
1000 inserts, 4ms
1000 lookups: 30ms

Lucene:
First million entries took 1 ms. This shows the async behavior of Lucene.
1000 inserts: about 4 seconds (!)
1000 lookups: under 1 ms.

(All numbers extremely approximated, and the numbers can only be seen
as relative performance indicators)


This is what i excpected. Lucene is optimized towards collecting large
amount of data batchwise, and then handle many searches. (Correct me
if i am wrong)
BabuDB "just writes" data and "just reads" them later on.

The test can of course be flawed.

BabuDB test:



package org.ogrm.test;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.Map.Entry;

import org.apache.commons.lang.math.RandomUtils;
import org.xtreemfs.babudb.BabuDB;
import org.xtreemfs.babudb.BabuDBException;
import org.xtreemfs.babudb.BabuDBFactory;
import org.xtreemfs.babudb.config.BabuDBConfig;
import org.xtreemfs.babudb.log.DiskLogger.SyncMode;
import org.xtreemfs.babudb.lsmdb.BabuDBInsertGroup;
import org.xtreemfs.babudb.lsmdb.Database;

public class TestBabuDb {

        private static Database db;

        public static void main( String[] args ) throws Exception {
                deleteFileOrDirectory( new File( "babudb" ) );
                BabuDB babuDb = BabuDBFactory.createBabuDB( new BabuDBConfig(
"babudb/db", "babudb/log", 1, 1024 * 1024 * 20,
                                10, SyncMode.ASYNC, 0, 0, false, 512, 1024 * 
1024 * 100 ) );
                db = babuDb.getDatabaseManager().createDatabase( "test", 1 );
                int init = 1000000;
                int num = 1000;
                int base = 0;
                int iterations = 1000;
                insert( init, base );
                base = init;
                for (int i = 0; i < iterations; i++) {
                        lookup( num, base );
                        insert( num, base );
                        base = base + num;
                }

                db.shutdown();
                babuDb.shutdown();
        }

        private static byte[] fastToBytes( long value ) throws IOException {
                byte[] array = new byte[8];
                for (int i = 0; i < 8; i++) {
                        array[7 - i] = (byte) (value >>> (i * 8));
                }
                return array;
        }

        private static long fastToLong( byte[] array ) throws IOException {
                long value = 0;
                for (int i = 0; i < array.length; i++) {
                        value <<= 8;
                        value ^= (long) array[i] & 0xFF;
                }
                return value;
        }

        private static byte[] lookupKey( String key, Object value ) {
                return String.valueOf( key + "|" + value + "|" ).getBytes();
        }

        private static byte[] key( long id, String key, Object value ) {
                return String.valueOf( key + "|" + value + "|" + id 
).getBytes();
        }

        private static void lookup( int num, int start ) throws Exception {
                long t = System.currentTimeMillis();
                for (int i = start; i < (start + num); i++) {
                        Iterator<Entry<byte[], byte[]>> entries = 
db.prefixLookup( 0,
lookupKey( "key", "value" + i ), null ).get();
                        while (entries.hasNext()) {
                                Entry<byte[], byte[]> entry = entries.next();
                                fastToLong( entry.getValue() );
                        }
                }
                System.out.println( num + " lookups:" + 
(System.currentTimeMillis() - t) );
        }

        private static void insert( int num, int start ) throws Exception {
                long t = System.currentTimeMillis();
                BabuDBInsertGroup group = db.createInsertGroup();

                for (int i = start; i < (num + start); i++) {
                        long id = i;
                        group.addInsert( 0, key( id, "key", "value" + i % 10000 
),
fastToBytes( id ) );
                }
                db.insert( group, null ).get();
                System.out.println( "insert time (" + num + "):" +
(System.currentTimeMillis() - t) );
        }

        public static void deleteFileOrDirectory( File file ) {
                if (!file.exists()) {
                        return;
                }

                if (file.isDirectory()) {
                        for (File child : file.listFiles()) {
                                deleteFileOrDirectory( child );
                        }
                        file.delete();
                } else {
                        file.delete();
                }
        }

        private static long randomId() {
                return RandomUtils.nextLong();
        }
}


TestLucene


package org.ogrm.test;

import java.io.File;
import java.io.IOException;

import org.apache.lucene.analysis.KeywordAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Field.Index;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.IndexWriter.MaxFieldLength;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;

public class TestLucene {
        private static IndexWriter writer;
        private static IndexSearcher searcher;

        public static void main( String[] args ) throws Exception {
                File path = new File( "lcn" );
                deleteFileOrDirectory( path );
                Directory dir = FSDirectory.open( path );
                writer = new IndexWriter( dir, new KeywordAnalyzer(),
MaxFieldLength.UNLIMITED );
                writer.setMaxBufferedDocs( 100000 );

                IndexReader reader = writer.getReader();
                searcher = new IndexSearcher( reader );

                int init = 1000000;
                int num = 1000;
                int base = 0;
                int iterations = 1000;
                insert( init, base );
                base = init;
                for (int i = 0; i < iterations; i++) {
                        lookup( num, base );
                        insert( num, base );
                        base = base + num;
                }
        }

        public static void deleteFileOrDirectory( File file ) {
                if (!file.exists()) {
                        return;
                }

                if (file.isDirectory()) {
                        for (File child : file.listFiles()) {
                                deleteFileOrDirectory( child );
                        }
                        file.delete();
                } else {
                        file.delete();
                }
        }

        private static void insert( int num, int base ) throws Exception {
                long t = System.currentTimeMillis();
                for (int i = num; i < (num + base); i++) {
                        Document doc = new Document();
                        doc.add( new Field( "_id_", fastToBytes( i ), Store.YES 
) );
                        doc.add( new Field( "key", "value" + i % 10000, 
Store.NO,
Index.NOT_ANALYZED ) );
                        writer.addDocument( doc );
                }
                writer.commit();
                System.out.println( num + " inserts in " + 
(System.currentTimeMillis() - t) );
        }

        private static void lookup( int num, int base ) throws Exception {
                long t = System.currentTimeMillis();
                for (int i = 0; i < 100; i++) {
                        Query query = new TermQuery( new Term( "key", "value" + 
(i + 2500000) ) );
                        TopDocs docs = searcher.search( query, 100 );
                        for (ScoreDoc scoreDoc : docs.scoreDocs) {
                                Document doc = searcher.doc( scoreDoc.doc );
                                fastToLong( doc.getBinaryValue( "_id_" ) );
                        }
                }
                System.out.println( num + " get " + (System.currentTimeMillis() 
- t) );
        }

        private static byte[] fastToBytes( long value ) throws IOException {
                byte[] array = new byte[8];
                for (int i = 0; i < 8; i++) {
                        array[7 - i] = (byte) (value >>> (i * 8));
                }
                return array;
        }

        private static long fastToLong( byte[] array ) throws IOException {
                long value = 0;
                for (int i = 0; i < array.length; i++) {
                        value <<= 8;
                        value ^= (long) array[i] & 0xFF;
                }
                return value;
        }
}



-atle
_______________________________________________
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user

Reply via email to