我想在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时性能会显着提高吗?
干杯!
答案 0 :(得分:0)
MapDB作者在这里。
首先使用专用键/值序列化器。类似的东西:
db.createTreeMap("map").keySerializer(BTreeKeySerializer.STRING).makeOrGet();
其次,您在1.0分支中遇到性能错误。这在2.0中得到了解决,但该分支尚未稳定。