THIS IS A TEST INSTANCE. ALL YOUR CHANGES WILL BE LOST!!!!
...
- 根据待合并文件列表,依次使用每个文件的TsFileSequenceReader,获取该文件的设备列表,生成所有的device集合
- 遍历device集合
- 根据文件从文件读取器cache中得到相应的TsFileSequenceReader
- 根据device读取各个文件对应的ChunkMetadataListIterator(ChunkMetadataListIterator每次按字典序吐出 metadata_index_degree 个sensor及其对应的ChunkMetadata列表)
- 遍历算法1输出的每批待合并的sensor列表
- 对于待合并列表中的每一个sensor
- 如果是乱序空间的文件合并,采取 反序列化Page合并算法
- 如果是顺序空间的文件合并
- 如果某个 Chunk 的数据点数小于 merge_page_point_number,采取 反序列化Page合并算法
- 如果page足够大,采取 追加Page合并算法
- 对于待合并列表中的每一个sensor
- 关闭reader cache中所有的reader
- 序列化新文件的 TsFileResource
- 关闭新文件writer
算法1
输入:多个文件的 ChunkMetadataListIterator(假设有3个文件:file1:(s1,s2)(s3,s4) file2:(s1, s3) file3:(s3,s4)
...
第三轮:file1(s4)+file3(s4) → (s4)
反序列化Page合并算法
- 通过各自文件的reader有序把数据读出并整理出对应的time-value列表
- 遍历上述的time-value列表,将数据写入新的ChunkWriter
- 判断限流
- 将ChunkWriter写入新文件
追加Page合并算法
- 通过各自文件的reader有序把chunk读出来,并通过合并ByteBuffer和统计信息的方式不解析chunk数据点、而有序合并出对应的新Chunk和ChunkMetadata
- 判断限流
- 将合并完的Chunk和ChunkMetadata写入新文件
...