org.apache.lucene.util.BitVector

这个小小的工具类用来保存bit数据,并且提供bit级别的boolean读写能力。
这部分能力类似java.util.BitSet

而有趣的地方在于BitVector提供了持久化的能力(保存到文件),
为节省磁盘空间:
            if (isSparse()) {
                writeDgaps(output); 
// sparse bit-set more efficiently saved as
                                    
// d-gaps.
            }
 else {
                writeBits(output);
            }
首先判断数据中是否bit值为1的数据非常少,如果是,就采用Dgaps算法,
这种算法将压缩数据,结构如下
     ..
III(IB)+

第1个Int为标记位,值-1表示为Dgaps
第2个Int为数据长度(多少个bit)
第3个Int为数据有多少个bit值为1

而后循环,只保存Byte值非0的串
第1个Int保存和上一个便宜
第2个位为Byte,保存Byte值(也就是8位bit)

呵呵,看来做indexer真是啥都省着用啊


btw,判断数据中是否bit值为1的数据非常少的算法页很有趣
    private boolean isSparse() {
        
// note: order of comparisons below set to favor smaller values (no
        
// binary range search.)
        
// note: adding 4 because we start with ((int) -1) to indicate d-gaps
        
// format.
        
// note: we write the d-gap for the byte number, and the byte (bits[i])
        
// itself, therefore
        
// multiplying count by (8+8) or (8+16) or (8+24) etc.:
        
// - first 8 for writing bits[i] (1 byte vs. 1 bit), and
        
// - second part for writing the byte-number d-gap as vint.
        
// note: factor is for read/write of byte-arrays being faster than
        
// vints.
        int factor = 10;
        
if (bits.length < (1 << 7))
            
return factor * (4 + (8 + 8* count()) < size();
        
if (bits.length < (1 << 14))
            
return factor * (4 + (8 + 16* count()) < size();
        
if (bits.length < (1 << 21))
            
return factor * (4 + (8 + 24* count()) < size();
        
if (bits.length < (1 << 28))
            
return factor * (4 + (8 + 32* count()) < size();
        
return factor * (4 + (8 + 40* count()) < size();
    }