簡體   English   中英

咆哮位圖使用比普通位集更多的存儲空間

[英]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 的內存占用就會增加。

  1. 這是預期的嗎?
  2. 在最壞的情況下,它不應該只是退回到基於位集的實現嗎?
  3. 0.999 不能被視為 0.001 的倒數,我們可以將它存儲在 288 個字節中嗎?
  4. 當我們進行服務間調用和使用傑克遜庫(但不是基於字節的序列化庫)時,將這些位集表示為字符串的最佳方式是什么

當條目數量很少時似乎就是這種情況,但是隨着條目數量的增加,差異變得不那么明顯。 盡管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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM