![](/img/trans.png)
[英]Whether iterating collection using a iterator is more effecient than normal iteration
[英]Roaring bitmap using more storage than normal bitset
我有一个用于跟踪项目是否存在的位集示例
b = 01100110000
它表示第 2 项和第 3 项存在,第 1 项和第 4 项不存在。
在搜索可以优化此位集数组的库时。 我遇到了听起来非常令人兴奋的咆哮位图。
我用它做了一个快速测试,
public static void main(String[] args) throws IOException {
RoaringBitmap roaringBitMap = new RoaringBitmap();
BitSet bitSet = new BitSet(5000);
double prob = 0.001;
Random random = new Random();
for (int i = 0; i < 5000; i++) {
if (random.nextDouble() < prob) {
bitSet.set(i);
roaringBitMap.add(i);
}
}
System.out.println(bitSet.cardinality());
System.out.println("bitset bytes: "+ bitSet.size());
System.out.println("RoaringBitmap bytes: " + roaringBitMap.getSizeInBytes() * 8);
}
基本上我们正在设置一些值并检查数据结构的整体大小。
当我们使用多个概率值运行它时。 我有
概率字节 | 位集字节 | RoaringBitmap 字节 |
---|---|---|
0.001 | 5056 | 288 |
0.01 | 5056 | 944 |
0.1 | 5056 | 7872 |
0.999 | 5056 | 65616 |
如果您看到我们插入的数字越来越多,RoaringBitmap 的内存占用就会增加。
当条目数量很少时似乎就是这种情况,但是随着条目数量的增加,差异变得不那么明显。 尽管lib作者没有确认(我在这里询问并在此处跟进)
概率 | 条目数 | 位集位 | RoaringBitmap 位 | 节省 % |
---|---|---|---|---|
0.001 | 50000 | 50048 | 928 | 98 |
0.01 | 50000 | 50048 | 7744 | 84 |
0.1 | 50000 | 50048 | 65616 | -31 |
0.999 | 50000 | 50048 | 65616 <- 注意它不会增加 | -31 |
0.001 | 500000 | 500032 | 8704 | 98 |
0.01 | 500000 | 500032 | 80720 | 83 |
0.1 | 500000 | 500032 | 524480 | -4 |
0.999 | 500000 | 500032 | 524480 <- 注意它不会增加 | -4 |
0.001 | 50000000 | 50000000 | 835232 | 98 |
0.01 | 50000000 | 50000000 | 8036368 | 83 |
0.1 | 50000000 | 50000000 | 50016240 | -0.03 |
0.999 | 50000000 | 50000000 | 50016240 <- 注意它不会增加 | -0.03 |
看着这一点,似乎随着条目数量的增加,他们可能只在幕后使用位图。 要点是不要盲目地使用库,测试你的用例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.