Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Pi Compressed Data function


IoTDB + SDT 设计

SDT Encoder

  • List<Long> timestamps
  • List<T> values 支持
    • List<Long> longValues
    • List<Integer> intValues
    • List<Double> doubleValues
    • List<Float> floatValues

  • encode(time, value, timeOut, valueOut) 对不同数据类型的values 需要提供不同的接口
    • timestamps.add(time)
    • values.add(value)

  • flush(timeOut, valueOut)
    • Sdt 对timestamps 和values 进行压缩(根据CD,compMax,compMin)
    • 写入 byteCache
    • 只针对内存中的数据进行压缩,压缩后,更新stats

SDT Decoder

  • getAllSatisfiedPageData 调用 Decoder.readLong
  • 返回page data的时候,Sdt 不需要进行解压
    • Sdt decoder 直接返回timebuffer + valuebuffer, 在pageReader 中遍历返回的结果,pagedata.put(t, v)

...

  • public boolean hasNext(ByteBuffer buffer)
    • pageReader, while sdtDecoder.hasNext(timeBuffer)
    • 遍历timeBuffer,返回一个时间戳
    • 调用方式
  • public long readLong(ByteBuffer buffer)
    • pageReader, while sdtDecoder.hasNext(timeBuffer)
      • long aLong = sdtDecoder.readLong(valueBuffer);
      • pageData.put(t, aLong)
    • 调用方式

PageWriter

需要提供的变量

  • private Encoder sdtEncoder;
  • private PublicBAOS timeOut, valueOut;

...

  • 刷入磁盘

                        

PageReader 

需要提供的变量

  • private Decoder sdtDecoder;
  • private ByteBuffer buffer;

...

  1. 不需要解压的查询
    1. 范围查询
      Select s1 where time > 3 and time < 10
      Group by
  2. 需要解压进行插值计算的查询
    1. 点查询
      Select s1 where time = 3
      1. 需要注意 time = 3 的前后两点,是否跨page
      2. 调用 SDTDecoder 
        1. S1 time = 3 的数据点经过压缩,并存在了磁盘,直接返回该点
        2. S1 time = 3 的数据点不存在,找到s1 time = 3 的前后两个数据点并进行插值计算

点查询

  1. Ie time = x,page1, page2, page3 ..
    1. return null
    2. 在该ts 第一个和最后一个时间戳之外,不进行插值计算
    1. 遍历pageReaders 的时候,记录 maxPrevPair, minNextPair 
    2. 若存在time = 3 的数据点,直接返回
    3. 若最后遍历完getValue == null,则通过 maxPrevPair, minNextPair 进行插值计算
    1. 遍历pageData 的时候,记录maxPrevPage, minNextPage
    2. 若生成pageReaders.size == 0,则通过 maxPrevPage, minNextPage 进行unpack page,decoder 返回插值计算的结果
    1. 若x < page1.startime || x > page3.endtime
    2. 若x >= page2.startime && x <= page2.endtime
    3. 若x >= page2.endtime && x <= page3.starttime



范围查询

  • 与当前逻辑一致,直接返回压缩后的结果集,不进行插值计算

...