THIS IS A TEST INSTANCE. ALL YOUR CHANGES WILL BE LOST!!!!
...
- 根据待合并文件列表,依次使用每个文件的TsFileSequenceReader,获取该文件的设备列表,生成所有的device集合
- 遍历device集合
- 根据文件从文件读取器cache中得到相应的TsFileSequenceReader
- 根据device读取各个文件对应的ChunkMetadataListIterator(ChunkMetadataListIterator每次按字典序吐出1000个sensor及其对应的ChunkMetadata列表)
- 循环遍历所有ChunkMetadataListIterator直到没有任何一个ChunkMetadataListIterator还有数据
- 对ChunkMetadataListIterator吐出的数据做归并排序,对于合并出来的每一个sensor及其对应的ChunkMetadata列表
- 如果是乱序空间的文件合并,采取deserialize合并,如果是乱序空间的文件合并,采取deserialize合并
- 通过各自文件的reader有序把数据读出并整理出对应的time-value列表
- 遍历上述的time-value列表,将数据写入新的ChunkWriter
- 判断限流
- 将ChunkWriter写入新文件
- 如果是顺序空间的文件合并
- 如果page足够大,采取append合并
- 通过各自文件的reader有序把chunk读出来,并通过合并ByteBuffer和统计信息的方式不解析chunk数据点、而有序合并出对应的新Chunk和ChunkMetadata
- 判断限流
- 将合并完的Chunk和ChunkMetadata写入新文件
- 如果page不足够大,采取deserialize合并
- 通过各自文件的reader有序把数据读出并整理出对应的time-value列表
- 遍历上述的time-value列表,将数据写入新的ChunkWriter
- 判断限流
- 将ChunkWriter写入新文件
- 如果page足够大,采取append合并
- 如果是乱序空间的文件合并,采取deserialize合并,如果是乱序空间的文件合并,采取deserialize合并
- 对ChunkMetadataListIterator吐出的数据做归并排序,对于合并出来的每一个sensor及其对应的ChunkMetadata列表
- 关闭reader cache中所有的reader
- 序列化新文件
- 关闭新文件writer
...
但是现在有了VectorMeasurementSchema,故一个IMeasurementSchema可能对应多个sensor,而现在的MManager又不支持查询一个sensor是不是在某个vector内,所以没有办法把按sensor合并改成按 VectorMeasurementSchema合并。
修改方案
将流程改为
- 根据文件列表获取所有的根据待合并文件列表,依次使用每个文件的TsFileSequenceReader,获取该文件的设备列表,生成所有的device集合
- 遍历device集合
- 从MManager中遍历该device对应的所有IMeasurementSchema
- 如果是 MeasurementSchema(单sensor)
- 走原来流程
- 如果是 VectorMeasurementSchema (多sensor)
- 通过各自文件的reader有序把数据读出并整理出对应的sensor-time-value列表
- 对这些sensor的time取并集,记为allTime
- 根据sensor遍历 sensor-time-value 列表
- 遍历allTime
- 遍历上述的sensor-time-value列表,将数据写入新的VectorChunkWriter,如果没有这个时间戳,则传isNull
- 判断限流
- 将VectorChunkWriter写入新文件
- 遍历allTime
- 如果是乱序空间的文件合并,采取deserialize合并
- 通过各自文件的reader有序把数据读出并整理出对应的time-value列表
- 遍历上述的time-value列表,将数据写入新的ChunkWriter
- 判断限流
- 将ChunkWriter写入新文件
- 如果是顺序空间的文件合并 如果是顺序合并
- 如果page足够大,采取append合并
- 通过各自文件的reader有序把chunk读出来,并通过合并ByteBuffer和统计信息的方式不解析chunk点而有序合并出对应的新Chunk和ChunkMetadata
- 判断限流
- 将合并完的Chunk和ChunkMetadata写入新文件
- 如果page不足够大,采取deserialize合并
- 通过各自文件的reader有序把数据读出并整理出对应的sensor-time-value列表
- 对这些sensor的time取并集,记为allTime
- 根据sensor遍历 sensor-time-value 列表
- 遍历allTime
- 遍历上述的sensor-time-value列表,将数据写入新的VectorChunkWriter,如果没有这个时间戳,则传isNull
- 判断限流
- 将VectorChunkWriter写入新文件
- 遍历allTime
- 如果page足够大,采取append合并
- 如果是 MeasurementSchema(单sensor)
- 关闭reader cache中所有的reader
- 序列化新文件
- 关闭新文件writer
- 从MManager中遍历该device对应的所有IMeasurementSchema
...