我以最好的方式使用MapDB吗?

时间:2014-08-11 20:04:33

标签: java garbage-collection voxel mapdb

我对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();

1 个答案:

答案 0 :(得分:0)

您正在使用通用序列化,这会产生一些开销。如果使用专门的序列化器,它应该更快:

db.createHashMap( "blocksScalars")
.keySerializer(Serializer.UUID)
.valueSerialzier(Serializer.INTEGER)