package me.lovegao.mapdb.hello;
import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.ConcurrentMap;
import org.eclipse.collections.impl.map.mutable.ConcurrentHashMap; import org.mapdb.DB; import org.mapdb.DBMaker; import org.mapdb.Serializer;
public class MapDBSpeedTest {
</span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">final</span> <span style="color: rgba(0, 0, 255, 1)">static</span> String DEMO_KEY = "Hello"<span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">final</span> <span style="color: rgba(0, 0, 255, 1)">static</span> String DEMO_VAL = "simple"<span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> main(String[] args) { System.out.println(</span>"--Hello,simple----"<span style="color: rgba(0, 0, 0, 1)">);
// fileMapMemoryMapTest(); mapTest();
} </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> mapTest() { </span><span style="color: rgba(0, 0, 255, 1)">int</span> dataNum = 10000<span style="color: rgba(0, 0, 0, 1)">; List</span><DB> dbList = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ArrayList(); Map</span><String, Map<String, Long>> testMap = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> HashMap(); Map</span><String, Long> dataMap =<span style="color: rgba(0, 0, 0, 1)"> generateTestData(dataNum); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">java原生-堆内map</span> ConcurrentMap<String, Long> inHeapDbMap = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ConcurrentHashMap(); testMap.put(</span>"原生map"<span style="color: rgba(0, 0, 0, 1)">, inHeapDbMap); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">堆外map</span> DB offHeapDb =<span style="color: rgba(0, 0, 0, 1)"> DBMaker.memoryDB().make(); dbList.add(offHeapDb); ConcurrentMap offHeapDbMap </span>= offHeapDb.hashMap("map"<span style="color: rgba(0, 0, 0, 1)">).createOrOpen(); testMap.put(</span>"堆外map"<span style="color: rgba(0, 0, 0, 1)">, offHeapDbMap); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">基于磁盘map</span> DB fileDb = DBMaker.fileDB("file1.db"<span style="color: rgba(0, 0, 0, 1)">).make(); dbList.add(fileDb); ConcurrentMap</span><String,Long> fileDbMap =<span style="color: rgba(0, 0, 0, 1)"> fileDb .hashMap(</span>"map1"<span style="color: rgba(0, 0, 0, 1)">, Serializer.STRING, Serializer.LONG) .createOrOpen(); testMap.put(</span>"基于磁盘map"<span style="color: rgba(0, 0, 0, 1)">, fileDbMap); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">基于磁盘-内存映射map</span> DB fileMmapDb =<span style="color: rgba(0, 0, 0, 1)"> DBMaker .fileDB(</span>"file2.db"<span style="color: rgba(0, 0, 0, 1)">) .fileChannelEnable() </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">By default MapDB uses RandomAccessFile to access disk storage. Outside fast mmap files there is third option based on FileChannel. It should be faster than RandomAccessFile</span> .fileMmapEnable() <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Always enable mmap
// .fileMmapEnableIfSupported() // Only enable mmap on supported platforms,对性能影响较大
.fileMmapPreclearDisable() <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Make mmap file faster
// .allocateStartSize( 10 * 1024*1024*1024) // 10GB,初始容量 // .allocateIncrement(512 * 1024*1024) // 512MB,每次增加容量 .make();
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">optionally preload file content into disk cache</span>
fileMmapDb.getStore().fileLoad();
dbList.add(fileMmapDb); ConcurrentMap</span><String,Long> fileMmapMap =<span style="color: rgba(0, 0, 0, 1)"> fileMmapDb .hashMap(</span>"map2"<span style="color: rgba(0, 0, 0, 1)">, Serializer.STRING, Serializer.LONG) .createOrOpen(); testMap.put(</span>"基于磁盘-内存映射map"<span style="color: rgba(0, 0, 0, 1)">, fileMmapMap); System.out.println(</span>"-----------put---数据量:"+dataNum+"------"<span style="color: rgba(0, 0, 0, 1)">); </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)">(String mapType : testMap.keySet()) { putGetMapTest(mapType, testMap.get(mapType), dataMap, </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">); } System.out.println(</span>"-----------------------------------------
“);
System.out.println(</span>"-----------get---数据量:"+dataNum+"------"<span style="color: rgba(0, 0, 0, 1)">); </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)">(String mapType : testMap.keySet()) { putGetMapTest(mapType, testMap.get(mapType), dataMap, </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">); } </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)">(DB db : dbList) { db.close(); } } </span><span style="color: rgba(0, 128, 0, 1)">/</span><span style="color: rgba(0, 128, 0, 1)"> * putGet测试 * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> map * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> dataMap * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> put * </span><span style="color: rgba(128, 128, 128, 1)">@return</span><span style="color: rgba(0, 128, 0, 1)"> <耗时, 异常数> </span><span style="color: rgba(0, 128, 0, 1)">*/</span> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> TwoTuple<Long, Long> putGetMapTest(String mapType, Map<String, Long> map, Map<String, Long> dataMap, <span style="color: rgba(0, 0, 255, 1)">boolean</span><span style="color: rgba(0, 0, 0, 1)"> put) { </span><span style="color: rgba(0, 0, 255, 1)">long</span> useTime = 0L<span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 0, 255, 1)">long</span> errorNum = 0L<span style="color: rgba(0, 0, 0, 1)">; Iterator</span><Entry<String, Long>> entryIt =<span style="color: rgba(0, 0, 0, 1)"> dataMap.entrySet().iterator(); </span><span style="color: rgba(0, 0, 255, 1)">while</span><span style="color: rgba(0, 0, 0, 1)">(entryIt.hasNext()) { Entry</span><String, Long> entry =<span style="color: rgba(0, 0, 0, 1)"> entryIt.next(); </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)">(put) { </span><span style="color: rgba(0, 0, 255, 1)">long</span> t1 =<span style="color: rgba(0, 0, 0, 1)"> System.nanoTime(); map.put(entry.getKey(), entry.getValue()); useTime </span>= System.nanoTime() -<span style="color: rgba(0, 0, 0, 1)"> t1; } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> { </span><span style="color: rgba(0, 0, 255, 1)">long</span> t1 =<span style="color: rgba(0, 0, 0, 1)"> System.nanoTime(); </span><span style="color: rgba(0, 0, 255, 1)">long</span> val =<span style="color: rgba(0, 0, 0, 1)"> map.get(entry.getKey()); useTime </span>= System.nanoTime() -<span style="color: rgba(0, 0, 0, 1)"> t1; </span><span style="color: rgba(0, 0, 255, 1)">if</span>(val !=<span style="color: rgba(0, 0, 0, 1)"> entry.getValue()) { errorNum</span>++<span style="color: rgba(0, 0, 0, 1)">; } } } </span><span style="color: rgba(0, 0, 255, 1)">double</span> avgUseTime = (<span style="color: rgba(0, 0, 255, 1)">double</span>)useTime /<span style="color: rgba(0, 0, 0, 1)"> dataMap.size(); String fmtStr </span>= "map类型:%s,总耗时:%dns,平均耗时%ens,异常数量:%d"<span style="color: rgba(0, 0, 0, 1)">; System.out.println(String.format(fmtStr, mapType, useTime, avgUseTime, errorNum)); </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">new</span> TwoTuple<Long, Long><span style="color: rgba(0, 0, 0, 1)">(useTime, errorNum); } </span><span style="color: rgba(0, 128, 0, 1)">/</span><span style="color: rgba(0, 128, 0, 1)"> * 生成测试数据 * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> size * </span><span style="color: rgba(128, 128, 128, 1)">@return</span> <span style="color: rgba(0, 128, 0, 1)">*/</span> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> Map<String, Long> generateTestData(<span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> size) { Map</span><String, Long> map = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> HashMap(); </span><span style="color: rgba(0, 0, 255, 1)">int</span> arrLength = 26<span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 0, 255, 1)">char</span>[] words = <span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">char</span><span style="color: rgba(0, 0, 0, 1)">[arrLength]; </span><span style="color: rgba(0, 0, 255, 1)">for</span>(<span style="color: rgba(0, 0, 255, 1)">int</span> i=0; i<arrLength; i++<span style="color: rgba(0, 0, 0, 1)">) { words[i] </span>= (<span style="color: rgba(0, 0, 255, 1)">char</span>) ('a' +<span style="color: rgba(0, 0, 0, 1)"> i); } System.out.println(words); String demoWord </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> String(words); </span><span style="color: rgba(0, 0, 255, 1)">for</span>(<span style="color: rgba(0, 0, 255, 1)">int</span> i=0; i<size; i++<span style="color: rgba(0, 0, 0, 1)">) { String key </span>= demoWord.substring(i%arrLength, i%arrLength) +<span style="color: rgba(0, 0, 0, 1)"> i; </span><span style="color: rgba(0, 0, 255, 1)">long</span> val =<span style="color: rgba(0, 0, 0, 1)"> i; map.put(key, val); } </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> map; } </span><span style="color: rgba(0, 128, 0, 1)">/</span><span style="color: rgba(0, 128, 0, 1)"> * 对外内存map </span><span style="color: rgba(0, 128, 0, 1)">*/</span> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> offHeapMapTest1() { DB db </span>=<span style="color: rgba(0, 0, 0, 1)"> DBMaker.memoryDB().make(); ConcurrentMap map </span>= db.hashMap("map"<span style="color: rgba(0, 0, 0, 1)">).createOrOpen(); map.put(DEMO_KEY, DEMO_VAL); System.out.println(</span>"第1次取值," +<span style="color: rgba(0, 0, 0, 1)"> map.get(DEMO_KEY)); } </span><span style="color: rgba(0, 128, 0, 1)">/</span><span style="color: rgba(0, 128, 0, 1)"> * 基于磁盘的存储 </span><span style="color: rgba(0, 128, 0, 1)">*/</span> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> fileMapTest1() { DB db </span>= DBMaker.fileDB("file.db"<span style="color: rgba(0, 0, 0, 1)">).make(); ConcurrentMap map </span>= db.hashMap("map"<span style="color: rgba(0, 0, 0, 1)">).createOrOpen(); map.put(DEMO_KEY, DEMO_VAL); System.out.println(</span>"第1次取值," +<span style="color: rgba(0, 0, 0, 1)">map.get(DEMO_KEY)); db.close(); System.out.println(</span>"----------重新打开----------"<span style="color: rgba(0, 0, 0, 1)">); db </span>= DBMaker.fileDB("file.db"<span style="color: rgba(0, 0, 0, 1)">).make(); map </span>= db.hashMap("map"<span style="color: rgba(0, 0, 0, 1)">).createOrOpen(); System.out.println(</span>"第2次取值," +<span style="color: rgba(0, 0, 0, 1)">map.get(DEMO_KEY)); db.close(); } </span><span style="color: rgba(0, 128, 0, 1)">/</span><span style="color: rgba(0, 128, 0, 1)"> * 在64位操作系统中,开启内存映射 * 个性化序列化 </span><span style="color: rgba(0, 128, 0, 1)">*/</span> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> fileMapMemoryMapTest() { DB db </span>=<span style="color: rgba(0, 0, 0, 1)"> DBMaker .fileDB(</span>"file.db"<span style="color: rgba(0, 0, 0, 1)">) .fileMmapEnable() .make(); ConcurrentMap</span><String,Long> map =<span style="color: rgba(0, 0, 0, 1)"> db .hashMap(</span>"mapsl"<span style="color: rgba(0, 0, 0, 1)">, Serializer.STRING, Serializer.LONG) .createOrOpen(); </span><span style="color: rgba(0, 0, 255, 1)">long</span> val = 51<span style="color: rgba(0, 0, 0, 1)">; map.put(DEMO_KEY, val); System.out.println(</span>"第1次取值,期望值:" + val + ",取到的值:" +<span style="color: rgba(0, 0, 0, 1)">map.get(DEMO_KEY)); db.close(); db </span>=<span style="color: rgba(0, 0, 0, 1)"> DBMaker .fileDB(</span>"file.db"<span style="color: rgba(0, 0, 0, 1)">) .fileMmapEnable() .make(); map </span>= db.hashMap("mapsl"<span style="color: rgba(0, 0, 0, 1)">, Serializer.STRING, Serializer.LONG) .createOrOpen(); System.out.println(</span>"第2次取值,期望值:" + val + ",取到的值:" +<span style="color: rgba(0, 0, 0, 1)">map.get(DEMO_KEY)); db.close(); }
}
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/h6javajc/8437.html