Versions Compared

Key

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

...

  • 获取 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
    • else
      • 将 fileCluster 中的 unseqFile 合并到一个临时文件中(如果有未关闭的临时文件,则放到未关闭的临时文件中;否则新建一个临时文件),然后将该临时文件经过重命名后(规则与前面 if 语句中的重命名过程相同)移动到顺序文件列表中


合并多个 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合并算法
  • 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写入新文件