结合lucene谈谈日期的压缩问题

提及日期值的压缩,通常容易想到的办法是将日期转化成long类型,而后再经过变长整形进行压缩,我算了一下按照毫秒来算最多占用5个字节(能够经过“谈谈变长整型”中的表查看),确实节省了部分空间,可是还有优化的余地,由于实际状况下日期可能只精确到秒、小时或者天。优化

lucene里用1个字节header中的前3位表示可能出现的5种状况:编码

一、时间精确到毫秒   header前3位值为000.net

二、时间精确到天      header前3位值为110code

三、时间精确到小时   header前3位值为100blog

四、时间精确到秒      header前3位值为010get

五、最后一种状况lucene是把long类型的值看成普通的值来对待,也就是可能有负数,所以首先把long值通过zigzag进行编码将负数转正,而后利用header剩下的5位存储zigzag编码后的5位值,若是剩余的位值不等于0,header前3位值为001,而且将剩余的位值按照变长整形进行压缩。lucene里面的long类型便可对日期压缩也可对普通的值压缩,有兴趣的能够查看源码:源码

 int header; 
    if (l % SECOND != 0) {
      header = 0;
    } else if (l % DAY == 0) {
      header = DAY_ENCODING;
      l /= DAY;
    } else if (l % HOUR == 0) {
      header = HOUR_ENCODING;
      l /= HOUR;
    } else {
      header = SECOND_ENCODING;
      l /= SECOND;
    }it

    final long zigZagL = BitUtil.zigZagEncode(l);
    header |= (zigZagL & 0x1F); // last 5 bits
    final long upperBits = zigZagL >>> 5;
    if (upperBits != 0) {
      header |= 0x20;
    }
    out.writeByte((byte) header);
    if (upperBits != 0) {
      out.writeVLong(upperBits);
    }ast

相关文章
相关标签/搜索