当前位置:网站首页 > Java基础 > 正文

java mapdb 教程



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>&lt;DB&gt; dbList = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ArrayList(); Map</span>&lt;String, Map&lt;String, Long&gt;&gt; testMap = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> HashMap(); Map</span>&lt;String, Long&gt; 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&lt;String, Long&gt; 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>&lt;String,Long&gt; 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>&lt;String,Long&gt; 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)"> &lt;耗时, 异常数&gt; </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&lt;Long, Long&gt; putGetMapTest(String mapType, Map&lt;String, Long&gt; map, Map&lt;String, Long&gt; 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>&lt;Entry&lt;String, Long&gt;&gt; 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>&lt;String, Long&gt; 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&lt;Long, Long&gt;<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&lt;String, Long&gt; generateTestData(<span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> size) { Map</span>&lt;String, Long&gt; 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&lt;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&lt;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>&lt;String,Long&gt; 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(); } 

}

版权声明


相关文章:

  • java在线考试教程2026-01-22 22:58:05
  • java教程费用多少2026-01-22 22:58:05
  • java热部署教程2026-01-22 22:58:05
  • idea建java教程2026-01-22 22:58:05
  • java虚拟机搭建教程2026-01-22 22:58:05
  • java飞机大战教程2026-01-22 22:58:05
  • java mybatis 教程2026-01-22 22:58:05
  • 设计模式 java视频教程2026-01-22 22:58:05
  • java教程542026-01-22 22:58:05
  • 模组教程java2026-01-22 22:58:05