...
- 获取 UnseqTsFileList 中的所有设备和传感器 deviceSensorsMap(Map<Device, List<Sensor>>)
- 将文件根据重叠情况整理成簇List<List<TsFileResource>> unseqFileClusters
- for fileCluster in unseqFileCluster
- if fileCluster.size() == 1
- if fileCluster 中仅有的这个文件大小 > cross_space_fragment_file_target_size
- 将 fileCluster 中的这个 unseqFile 的名字改成 (后一个顺序文件的时间戳-1)-(后一个顺序文件的版本号)-0-1.tsfile
- 如果存在同名文件,则改成(后一个顺序文件的时间戳-1)-(系统最新版本号)-0-1.tsfile,同时更新系统最新版本号
- else
- 将该文件的内容写到一个临时的文件中,不关闭该文件
- continue
- if fileCluster 中仅有的这个文件大小 > cross_space_fragment_file_target_size
- else
- 将 fileCluster 中的 unseqFile 合并到一个临时文件中(如果有未关闭的临时文件,则放到未关闭的临时文件中;否则新建一个临时文件),然后将该临时文件经过重命名后(规则与前面 if 语句中的重命名过程相同)移动到顺序文件列表中
- if fileCluster.size() == 1
合并多个 unseqFile
参考空间内文件合并执行流程
输入:待合并的乱序文件列表
- deviceSet=[]
- 如果有未关闭的临时文件,那么 writer = 未关闭的临时文件的 RestorableWriter,否则 writer = 新建的临时文件的 RestorableWriter
- for tsfile in TsFileList
- 从 FileReaderManager 中获取此 tsfile 的 TsFileSequenceReader,并读出该文件的设备列表,添加至 deviceSet
- for device in deviceSet
- metadataIteratorList = []
- for tsfile in TsFileList
- 读取 tsfile 中 device 对应的 ChunkMetadataListIterator(ChunkMetadataListIterator每次按字典序吐出 max_degree_of_index_node 个 sensor 及其对应的 ChunkMetadata 列表)
- 将 ChunkMetadataListIterator 添加到 metadataIteratorList
- 遍历 算法1 输出的每批待合并的 sensor 列表
- 对于待合并列表中的每一个 sensor
- 采取 反序列化Page合并算法
- 对于待合并列表中的每一个 sensor
- for tsfile in TsFileList
- 将 FileReaderManager 中此文件 decreaseReaderReference
- 序列化新文件的 TsFileResource
- 关闭新文件 writer
算法1:
输入:多个文件的 ChunkMetadataListIterator(iterator),Iterator 每次输出的 List 内的 sensor 个数为 max_index_degree(假设有3个文件:file1:(s1,s2),(s3) file2:(s1, s3) file3:(s1,s2),(s3,s5)
输出:每轮待合并的 sensor 列表
描述:每个 iterator 取1个 List,找到每个 List 的最大字典序的 sensor,组成集合 S,本次合并从头开始合并到 S 中最小字典序的 sensor_lex_min_lex_min,直到所有都合并完 。并从 List 中清除已合并的 sensor,如果此 List 消耗完,获取下一个 Lst
优势:每次至少会消耗完一个 file 的一个 List
- getNextSensors(List<ChunkMetadataListIterator> iterators)
- getNextSensors(List<ChunkMetadataListIterator> iterators)
第一轮:file1(s1,s2)+file2(s1,s3)+file3(s1,s2) → S=S=(s2, s3),最小字典序 sensor_lex_min 是 s2 → 从 s2, s3),最小字典序 sensor_lex_min 是 s2 → 从 s1 合并到 合并到 s2
第二轮:file1(s3)+file2(s3)+file3(s3,s5) → S=S=(s3, s5, s5),最小字典序 sensor_lex_min 是 s3 → 从 s3 合到 s3,最小字典序 sensor_lex_min 是 s3 → 从 s3 合到 s3
第三轮:file3(s5) → S=S=(s5),最小字典序 sensor_lex_min 是 s5 → 从 s5 合到 s5,最小字典序 sensor_lex_min 是 s5 → 从 s5 合到 s5
反序列化Page合并算法
- 通过各自文件的reader有序把数据读出并整理出对应的time-value列表
- 遍历上述的time-value列表,将数据写入新的ChunkWriter
- 判断限流
- 将ChunkWriter写入新文件