0

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

key = long (8 bytes) value = (UUID + from-date + to-date) 的最多 5 个条目,所以 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 时性能会显着提高吗?

干杯!

4

1 回答 1

0

MapDB作者在这里。

首先使用专门的键/值序列化器。就像是:

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

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

于 2015-04-06T10:12:29.070 回答