我有一个非常大的文件(10 ^ 8行),其事件计数如下,
A 10
B 11
C 23
A 11
我需要累积每个事件的计数,以便我的地图包含
A 21
B 11
C 23
我目前的做法:
读取线条,维护地图,并按地址更新地图中的计数
updateCount(Map<String, Long> countMap, String key,
Long c) {
if (countMap.containsKey(key)) {
Long val = countMap.get(key);
countMap.put(key, val + c);
} else {
countMap.put(key, c);
}
}
目前这是代码中最慢的部分(大约需要25毫秒)。 请注意,该地图是基于MapDB的,但我怀疑这些更新是否很慢(是吗?)
这是地图的mapdb配置,
DBMaker.newFileDB(dbFile).freeSpaceReclaimQ(3)
.mmapFileEnablePartial()
.transactionDisable()
.cacheLRUEnable()
.closeOnJvmShutdown();
有办法加快速度吗?
修改:
唯一键的数量是维基百科中页面的顺序。这些数据实际上是来自here的网页流量数据。
答案 0 :(得分:0)
您可以尝试
class Counter {
long count;
}
void updateCount(Map<String, Counter> countMap, String key, int c) {
Counter counter = countMap.get(key);
if (counter == null) {
counter = new Counter();
countMap.put(key, counter);
counter.count = c;
} else {
counter.count += c;
}
}
这不会创建很多Long包装器,而只是为计数器分配键数。
注意:不要创建Long。上面我使c
成为一个int,不监督long / Long。
答案 1 :(得分:0)
作为一个起点,我建议考虑:
答案 2 :(得分:0)
如果您使用的是TreeMap,则可以使用
等性能调整选项https://github.com/jankotek/MapDB/blob/master/src/test/java/examples/Huge_Insert.java