MapDB固定了键和值的结构

时间:2015-03-25 17:52:22

标签: java mapdb

我想在MapDB中存储几十亿个键值对。我有具体要求:

key = long(8字节) value =最多5个条目(UUID + from-date + to-date),所以5 * 32 bytes = 160

要求是使用单线程应用:按键加载,并更改条目中的一个日期。值的大小不会改变。

我想知道最有效的设置是做什么和放置。通过预先分配160的字节数组并将其用作值来获得性能吗?或者不重要,只使用大小灵活的字节数组?

目前我有

       DB db = DBMaker
            .newFileDB(dbFile)
            .asyncWriteEnable()
            .asyncWriteFlushDelay(100)
            .transactionDisable()
            .make();

泵:

       BTreeKeySerializer keySerializer = BTreeKeySerializer.ZERO_OR_POSITIVE_LONG;
       Map<Long, Item> map = db.createTreeMap("map")
            .pumpSource(source)
            .keySerializer(keySerializer)
            .make();

来源

Iterator<Fun.Tuple2<Long, byte[]>> source = new Iterator<Fun.Tuple2<Long, byte[]>>()

装载

        Map<Long, byte[]> map = db.<Long, byte[]>getTreeMap("map");

使用数据泵加载具有20,000,000个项目的地图后(性能会随着时间的推移而降低),查找有点令人失望:

在199,999毫秒内查找200,000次。 (约1000 /秒)

在第二次运行我的测试应用程序后,查找会显着增加:

在7,597毫秒内进行200,000次查找。

根据键/值的固定大小要求,我能做些什么来提高性能?我可以启用哪些选项?

我使用了TreeMap,因为它有一个数据泵。使用HashMap时性能会显着提高吗?

干杯!

1 个答案:

答案 0 :(得分:0)

MapDB作者在这里。

首先使用专用键/值序列化器。类似的东西:

db.createTreeMap("map").keySerializer(BTreeKeySerializer.STRING).makeOrGet();

其次,您在1.0分支中遇到性能错误。这在2.0中得到了解决,但该分支尚未稳定。