package org.gbif.nub.mapdb; import org.gbif.api.vocabulary.Kingdom; import org.gbif.api.vocabulary.Rank; import org.gbif.nub.lookup.straight.LookupKryoFactory; import org.gbif.nub.lookup.straight.LookupUsage; import java.util.Map; import java.util.UUID; import org.junit.Test; import org.mapdb.DB; import org.mapdb.DBMaker; import org.mapdb.Serializer; import org.mapdb.serializer.SerializerJava; import static org.junit.Assert.assertNotNull; public class MapDbObjectSerializerTest { final int repeat = 100000; @Test public void testObjs() throws Exception { //final File dbf = File.createTempFile("clb", "x"); final String dbf = "/tmp/clb-"+ UUID.randomUUID()+".db"; final DBMaker.Maker dbm = DBMaker .fileDB(dbf) .fileMmapEnableIfSupported() // Only enable mmap on supported (64bit) platforms .cleanerHackEnable() // Make mmap file faster ; // warmup db & kryo DB db = dbm.make(); Map<Long, LookupUsage> kvp = getMap(db); kvp.put(1l, usage(1)); kvp.clear(); // start long start = System.currentTimeMillis(); for (long x = 0l; x < repeat; x++) { kvp.put(x, usage((int) x)); } db.commit(); logRate("write", start); db.close(); // open again and read db = dbm.make(); kvp = getMap(db); start = System.currentTimeMillis(); for (long x = 0; x < repeat; x++) { LookupUsage u2 = kvp.get(x); assertNotNull("Not in map", u2); } db.commit(); logRate("read", start); db.close(); } private void logRate(String name, long start) { System.out.print(name); System.out.print(": "); long rate = repeat / (System.currentTimeMillis() - start); System.out.println(rate + "/ms"); } private Map<Long, LookupUsage> getMap(DB db) { return db.hashMap("usages") .keySerializer(Serializer.LONG) .valueSerializer(new MapDbObjectSerializer<LookupUsage>(LookupUsage.class, new LookupKryoFactory())) .createOrOpen(); } private Map<Long, LookupUsage> getMapNative(DB db) { return db.hashMap("usages") .keySerializer(Serializer.LONG) .valueSerializer(new SerializerJava()) .createOrOpen(); } public static LookupUsage usage(int key) { return usage(key, Rank.SPECIES); } public static LookupUsage usage(int key, Rank rank) { LookupUsage u = new LookupUsage(); u.setKey(key); u.setAuthorship("Mill."); u.setCanonical("Abies alba"); u.setDeleted(false); u.setKingdom(Kingdom.PLANTAE); u.setRank(rank); u.setYear("1867"); return u; } }