Versions Compared

Key

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

...

输入:待合并文件列表 SeqTsFileList, UnseqTsFileList

  • deviceSet=[]
  • writer = 目标文件 RestorableTsFileIOWriter获取 SeqTsFileList和UnseqTsFileList 中的所有设备 deviceSet
  • for tsfile in TsFileList从 FileReaderManager 中获取此 tsfile 的 TsFileSequenceReader,并读出该文件的设备列表,添加至 device in deviceSet
    • for
    device in deviceSet
    • seqFile in  SeqTsFileList
      • 新建一个临时 seqFile, 并建立 RestorableFileWriter writer 
      • 对于 seqFile 新建 ChunkMetadataListIterator
      • ChunkMetadataListIterator 中迭代获取该设备的 sensorList 及其对应的 List<ChunkMetadata> sensorChunkMetadataList(每次返回 max
    • metadataIteratorList = []
    • for tsfile in TsFileList
      • 读取 tsfile 中 device 对应的 ChunkMetadataListIterator(ChunkMetadataListIterator每次按字典序吐出 max_degree_of_index_node 个 sensor 及其对应的 ChunkMetadata 列表)
      • 将 ChunkMetadataListIterator 添加到 metadataIteratorList
    • 遍历 算法1 输出的每批待合并的 sensor 列表
      • 对于待合并列表中的每一个 sensor
        • 如果是乱序空间的文件合并,采取 反序列化Page合并算法
        • 如果是顺序空间的文件合并
          • 如果某个 Chunk 的数据点数小于 merge_page_point_number,采取 反序列化Page合并算法
          • 否则,采取 追加Page合并算法
  • for tsfile in TsFileList
    • 将 FileReaderManager 中此文件 decreaseReaderReference
  • 序列化新文件的 TsFileResource
      • sensor),对于每一个迭代
        • for sensor, sensorChunkMetadataList:
          • 根据 算法1 将该 sensor 的 Chunk 与对应的 unseqReader 中的数据进行合并

算法1

输入:sensor, sensorChunkMetadataList, unseqReader

  • for chunkMetadata in sensorChunkMetadataList
    • chunk = readMemChunk(chunkMetadata)
    • unclosedChunkPoint = 0L
    • if isOverlap(chunkMetadata)
      • 将其与乱序数据重叠的部分合并后写入 ChunkWriter(见 算法2
      • unclosedChunkPoint+=写入的点数
    • else if isChunkTooSmall(chunkMetadata)
      • 将这个 Chunk 解压缩后写入 ChunkWriter
      • unclosedChunkPoint+=写入的点数
    • else
      • if  unclosedChunkPoint>0
        • 将这个 Chunk 解压缩后写入 ChunkWriter
      • else 
        • 将这个 Chunk 不解压缩写入 writer
    • if unclosedChunkPoint > merge_chunk_point_num_threshold
      • 将 ChunkWriter 写入 writer
      • unclosedChunkPoint = 0

算法2

输入:chunk ,unseqReader

  • 对 Chunk 构建一个 ChunkReader
  • 使用 ChunkReader 获取 Chunk 中的每一个 Page
    • while pageData.hasNext() 
      • 获取 pageData 当前的时间戳 seqTime
      • overwriteSeqPoint = False
      • while 该 sensor 还有乱序数据并且乱序数据的下一个时间戳小于 seqTime
        • 将乱序数据写入 ChunkWrtier 中
        • 如果乱序数据的时间戳 == seqTime
          • overwriteSeqPoint = True
      • if !overwriteSeqPoint
        • 将 pageData 当前的数据点写入 ChunkWriter 中
    关闭新文件 writer