THIS IS A TEST INSTANCE. ALL YOUR CHANGES WILL BE LOST!!!!
...
输入:待合并文件列表 SeqTsFileList, UnseqTsFileList
- deviceSet=[]
- writer = 目标文件 RestorableTsFileIOWriter获取 SeqTsFileList和UnseqTsFileList 中的所有设备 deviceSet
- for tsfile in TsFileList从 FileReaderManager 中获取此 tsfile 的 TsFileSequenceReader,并读出该文件的设备列表,添加至 device in deviceSet
- for
- 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合并算法
- 对于待合并列表中的每一个 sensor
- for tsfile in TsFileList
- 将 FileReaderManager 中此文件 decreaseReaderReference
- 序列化新文件的 TsFileResource
- sensor),对于每一个迭代
- for sensor, sensorChunkMetadataList:
- 根据 算法1 将该 sensor 的 Chunk 与对应的 unseqReader 中的数据进行合并
- for sensor, sensorChunkMetadataList:
- sensor),对于每一个迭代
算法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>0
- 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 中
- while pageData.hasNext()