Versions Compared

Key

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

...

因此,TsFileResource 不能全部驻留在内存中,需要设计以下内容:


  • TsFileResource 和 TsFile 的对应关系?(1对1,1对多)
  • TsFileResource 的时间索引粒度?
  • 将哪些 TsFileResource 放在内存里?
  • 内存中的 TsFileResource 何时踢出?
  • 查询时如何将未缓存在内存的 TsFileResource 加载进内存?

目标场景

...


方案1


目标

  • 将最近的 TsFileResource 缓存在内存,踢出老文件
  • 通过控制 TsFile 大小,减少 TsFileResource 个数
  • 通过存储组和分区名等隐含规则索引 TsFileResource,通过内存计算定位 TsFileResource,尽量不存储额外信息


要求:开启时间分区

缺点:当分区数为1时没有效果


引入 TsFileResourceManager,分配一定内存。

根据 存储组 → 虚拟存储组 → 分区号 → List<TsFileResource> 统一管理 TsFileResource


每关闭一个 TsFileResource 时,计算其内存,内存达到设置的阈值后,将最老的分区的 List<TsFileResource> 清空


当需要一个分区的文件时,到磁盘上 listFiles


方案2


主要思想:假设使用 FILE_TIME_INDEX 没有内存问题。根据内存动态切换 FILE_TIME_INDEX 和 DEVICE_TIME_INDEX。


TsFileManagement 中按照 存储组 → 虚拟存储组 → 分区号 → List<TsFileResource> 管理 TsFileResource。

将 TsFileResource 抽为接口,两个实现类,ClosedTsFileResource,UnclosedTsFileResource


引入 TsFileResourceManager,根据 List<TsFileResource> 统一管理 TsFileResource 引用。

每关闭一个 TsFileResource 时,将其内存统计入 TsFileResourceManager 里。


缓存策略中:

踢出一个 TsFileResource 的操作为:将 TsFileResource 中的 TimeIndex 改为 FILE_TIME_INDEX。



方案3


保持现有的 TIME_INDEX 不变,每个存储组保留固定个 TsFileResource,当总内存超过阈值,就将 TsFileResource 合并。可以应用多种合并策略。


例:

File1

root.sg.d1.s1, 1, 10

root.sg.d1.s2, 1, 10


File2

root.sg.d2.s1, 1, 10

root.sg.d1.s2, 11, 20


合并后:

File1, File2

root.sg.d1.s1, 1, 10

root.sg.d2.s1, 1, 10

root.sg.d1.s2, 1, 20