RoaringDocIdSet相似於談談BitSet的缺點提到的SparseFixedBitSet是一個用於優化整形序列的存儲手段,並按照65536個元素進行分段存儲即每段中存儲的序列最可能是65536個,每一個分段中的數值都是對65536取模後進行存儲的。數組
每一個數據段都有各自的存儲格式:優化
一、當每段中的序列個數小於等於4096個時採用short數組進行存儲;.net
二、當每段中的序列個數等於65536或者大於65536-4096=61440時保存的是序列的差集,序列的差集正好用short數組進行保存;blog
三、當每段中的序列個數小於等於61440大於4096時採用FixedBitSet進行保存;get
問題1:選用65536爲分段中元素的最大個數是由於short的最大值爲65535;源碼
問題2:爲何當每段中的序列個數小於等於4096個時採用short數組進行存儲?it
假如該段只有1個數值65535,採用short存儲只需2個字節,而採用FixedBitSet就必定是8192個字節,當元素個數大於4096時採用short數值存儲佔用空間大於8192個字節,然而FixedBitSet最多才佔用8192個字節,因此當每段中的序列個數小於等於4096個時採用short數組進行存儲。lucene
問題3:在lucene中指出RoaringDocIdSet必須按照順序對docID進行添加,爲何?數據
我的認爲是爲了節省運行時空間與代碼複雜度,假設不按照順序添加,那麼在最後一個元素添加完以前就不能像源碼中那樣一段一段的處理序列了,必須按照123條件那樣檢查序列。ps