我想在 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 时性能会显着提高吗?
干杯!