我有一个关于 MapDB 的问题。
下面的代码摘录来自用于管理体素数据的更大系统的一部分,细节并不重要。
我创建的地图的使用频繁且范围很大,因为这些地图通常存储数百万条记录,并被多个不同的线程引用。
在对代码进行分析后,我发现它的执行速度比我自己推出的堆外缓存代码慢得多,并且会导致大量的 GC 活动。GC 活动似乎以分配和垃圾收集数百万个 long[] 实例为中心,相当频繁。
我的问题是,从 MapDB 的作者或那些有经验的人那里,以下代码是 MapDB 的正确(最佳实践)使用模型,我正在尝试做什么?
需要注意的是,尽管所有这些映射都具有相同的键/值设置,并且我可以只使用一个大映射,但由于我的并发处理管道,我选择了分解数据。
提前致谢!
HTreeMap<Fun.Tuple2<UUID,Integer>,Double> blockScalars;
HTreeMap<Fun.Tuple2<UUID,Integer>,Double> scalarIndices;
HTreeMap<Fun.Tuple2<UUID,Integer>,Double> points;
HTreeMap<Fun.Tuple2<UUID,Integer>,Double> tris;
HTreeMap<Fun.Tuple2<UUID,Integer>,Double> vertNorms;
DB db = DBMaker
.newMemoryDirectDB()
.transactionDisable()
.asyncWriteFlushDelay( 100 )
.make();
blocks = new FastMap<UUID, Block>();
DB.HTreeMapMaker blockScalarsMaker =
db.createHashMap( "blocksScalars" );
blockScalars = blockScalarsMaker.makeOrGet();
DB.HTreeMapMaker scalarIndicesMaker =
db.createHashMap( "scalarIndices" );
scalarIndices = scalarIndicesMaker.makeOrGet();
DB.HTreeMapMaker pointsMaker =
db.createHashMap( "points" );
points = pointsMaker.makeOrGet();
DB.HTreeMapMaker trisMaker =
db.createHashMap( "tris" );
tris = trisMaker.makeOrGet();
DB.HTreeMapMaker vertNormsMaker =
db.createHashMap( "vertNorms" );
vertNorms = vertNormsMaker.makeOrGet();
* 更新,2014 年 8 月 15 日 *
我刚刚尝试了以下方法,但它仍然很慢:
DB.BTreeMapMaker blockScalarsMaker =
db.createTreeMap( "blocksScalars" )
.keySerializer( new BTreeKeySerializer.Tuple2KeySerializer(null,Serializer.UUID,Serializer.INTEGER));
blockScalars = blockScalarsMaker.makeOrGet();