![](/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.