Java 我是否以最佳方式使用MapDB?

Java 我是否以最佳方式使用MapDB?,java,garbage-collection,voxel,mapdb,Java,Garbage Collection,Voxel,Mapdb,我有一个关于MapDB的问题 下面的代码摘录来自一个更大的体素数据管理系统的一部分,细节并不重要 我创建的映射的使用频率很高,范围也很大,因为这些映射通常存储数百万条记录,并且被几个不同的线程引用 在分析代码时,我发现它的执行速度比我的主滚下堆缓存代码慢得惊人,并且导致了不需要的GC活动量。GC活动似乎集中在分配和垃圾收集上百万个长[]实例上,相当频繁 我的问题是,从MapDB的作者或有经验的人那里,以下代码是MapDB的正确最佳实践使用模型吗?我正在尝试做什么 需要注意的是,尽管所有这些映射都

我有一个关于MapDB的问题

下面的代码摘录来自一个更大的体素数据管理系统的一部分,细节并不重要

我创建的映射的使用频率很高,范围也很大,因为这些映射通常存储数百万条记录,并且被几个不同的线程引用

在分析代码时,我发现它的执行速度比我的主滚下堆缓存代码慢得惊人,并且导致了不需要的GC活动量。GC活动似乎集中在分配和垃圾收集上百万个长[]实例上,相当频繁

我的问题是,从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();

您正在使用泛型序列化,这会带来一些开销。如果使用专门的序列化程序,速度应该更快:

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

我的密钥类型为:Fun.Tuple2,因此Serializer.UUID不起作用。此外,我找不到用于Double的序列化程序。
db.createHashMap( "blocksScalars")
.keySerializer(Serializer.UUID)
.valueSerialzier(Serializer.INTEGER)