blob: 537ad4d7d8d948252d4e38b818c9e48b69adaba3 [file] [log] [blame]
(window.webpackJsonp=window.webpackJsonp||[]).push([[376],{945:function(t,e,s){"use strict";s.r(e);var a=s(70),n=Object(a.a)({},(function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"tsfile-文件格式"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#tsfile-文件格式"}},[t._v("#")]),t._v(" TsFile 文件格式")]),t._v(" "),s("h2",{attrs:{id:"_1-tsfile-设计"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-tsfile-设计"}},[t._v("#")]),t._v(" 1. TsFile 设计")]),t._v(" "),s("p",[t._v("本章是关于 TsFile 的设计细节。")]),t._v(" "),s("h3",{attrs:{id:"_1-1-变量的存储"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-1-变量的存储"}},[t._v("#")]),t._v(" 1.1 变量的存储")]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("大端存储")]),t._v(" "),s("ul",[s("li",[t._v("比如: "),s("code",[t._v("int")]),t._v(" "),s("code",[t._v("0x8")]),t._v(" 将会被存储为 "),s("code",[t._v("00 00 00 08")]),t._v(", 而不是 "),s("code",[t._v("08 00 00 00")])])])]),t._v(" "),s("li",[s("strong",[t._v("可变长的字符串类型")]),t._v(" "),s("ul",[s("li",[t._v("存储的方式是以一个 "),s("code",[t._v("int")]),t._v(" 类型的 "),s("code",[t._v("Size")]),t._v(" + 字符串组成。"),s("code",[t._v("Size")]),t._v(" 的值可以为 0。")]),t._v(" "),s("li",[s("code",[t._v("Size")]),t._v(" 指的是字符串所占的字节数,它并不一定等于字符串的长度。")]),t._v(" "),s("li",[t._v('举例来说,"sensor_1" 这个字符串将被存储为 '),s("code",[t._v("00 00 00 08")]),t._v(' + "sensor_1" (ASCII编码)。')]),t._v(" "),s("li",[t._v('另外需要注意的一点是文件签名 "TsFile000001" ('),s("code",[t._v("Magic String")]),t._v(" + "),s("code",[t._v("Version")]),t._v("), 因为他的 "),s("code",[t._v("Size(12)")]),t._v(" 和 ASCII 编码值是固定的,所以没有必要在这个字符串前的写入 "),s("code",[t._v("Size")]),t._v(" 值。")])])]),t._v(" "),s("li",[s("strong",[t._v("数据类型")]),t._v(" "),s("ul",[s("li",[t._v("0: BOOLEAN")]),t._v(" "),s("li",[t._v("1: INT32 ("),s("code",[t._v("int")]),t._v(")")]),t._v(" "),s("li",[t._v("2: INT64 ("),s("code",[t._v("long")]),t._v(")")]),t._v(" "),s("li",[t._v("3: FLOAT")]),t._v(" "),s("li",[t._v("4: DOUBLE")]),t._v(" "),s("li",[t._v("5: TEXT ("),s("code",[t._v("String")]),t._v(")")])])]),t._v(" "),s("li",[s("strong",[t._v("编码类型")]),t._v(" "),s("ul",[s("li",[t._v("0: PLAIN")]),t._v(" "),s("li",[t._v("1: DICTIONARY")]),t._v(" "),s("li",[t._v("2: RLE")]),t._v(" "),s("li",[t._v("3: DIFF")]),t._v(" "),s("li",[t._v("4: TS_2DIFF")]),t._v(" "),s("li",[t._v("5: BITMAP")]),t._v(" "),s("li",[t._v("6: GORILLA_V1")]),t._v(" "),s("li",[t._v("7: REGULAR")]),t._v(" "),s("li",[t._v("8: GORILLA")])])]),t._v(" "),s("li",[s("strong",[t._v("压缩类型")]),t._v(" "),s("ul",[s("li",[t._v("0: UNCOMPRESSED")]),t._v(" "),s("li",[t._v("1: SNAPPY")]),t._v(" "),s("li",[t._v("2: GZIP")]),t._v(" "),s("li",[t._v("3: LZO")]),t._v(" "),s("li",[t._v("4: SDT")]),t._v(" "),s("li",[t._v("5: PAA")]),t._v(" "),s("li",[t._v("6: PLA")]),t._v(" "),s("li",[t._v("7: LZ4")])])])]),t._v(" "),s("h3",{attrs:{id:"_1-2-tsfile-概述"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-2-tsfile-概述"}},[t._v("#")]),t._v(" 1.2 TsFile 概述")]),t._v(" "),s("p",[t._v("TsFile 整体分为两大部分:"),s("strong",[t._v("数据区")]),t._v("和"),s("strong",[t._v("索引区")]),t._v("。")]),t._v(" "),s("p",[s("strong",[t._v("数据区")]),t._v("所包含的概念由小到大有如下三个:")]),t._v(" "),s("ul",[s("li",[s("p",[s("strong",[t._v("Page数据页")]),t._v(":一段时间序列,是数据块被反序列化的最小单元;")])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Chunk数据块")]),t._v(":包含一条时间序列的多个 Page ,是数据块被IO读取的最小单元;")])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("ChunkGroup数据块组")]),t._v(":包含一个实体的多个 Chunk。")])])]),t._v(" "),s("p",[s("strong",[t._v("索引区")]),t._v("分为三部分:")]),t._v(" "),s("ul",[s("li",[s("p",[t._v("按时间序列组织的 "),s("strong",[t._v("TimeseriesIndex")]),t._v(",包含1个头信息和数据块索引(ChunkIndex)列表。头信息记录文件内某条时间序列的数据类型、统计信息(最大最小时间戳等);数据块索引列表记录该序列各Chunk在文件中的 offset,并记录相关统计信息(最大最小时间戳等);")])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("IndexOfTimeseriesIndex")]),t._v(",用于索引各TimeseriesIndex在文件中的 offset;")])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("BloomFilter")]),t._v(",针对实体(Entity)的布隆过滤器。")])])]),t._v(" "),s("blockquote",[s("p",[t._v("注:ChunkIndex 旧称 ChunkMetadata;TimeseriesIndex 旧称 TimeseriesMetadata;IndexOfTimeseriesIndex 旧称 TsFileMetadata。v0.13版本起,根据其索引区的特性和实际所索引的内容重新命名。")])]),t._v(" "),s("p",[t._v("下图是关于 TsFile 的结构图。")]),t._v(" "),s("img",{staticStyle:{width:"100%","max-width":"800px","max-height":"600px","margin-left":"auto","margin-right":"auto",display:"block"},attrs:{src:"https://user-images.githubusercontent.com/19167280/123542462-6710c180-d77c-11eb-9afb-a1b495c82ea9.png"}}),t._v(" "),s("p",[t._v("此文件包括两个实体 d1、d2,每个实体分别包含三个物理量 s1、s2、s3,共 6 个时间序列。每个时间序列包含两个 Chunk。")]),t._v(" "),s("p",[t._v("TsFile 的查询流程,以查 d1.s1 为例:")]),t._v(" "),s("ul",[s("li",[t._v("反序列化 IndexOfTimeseriesIndex,得到 d1.s1 的 TimeseriesIndex 的位置")]),t._v(" "),s("li",[t._v("反序列化得到 d1.s1 的 TimeseriesIndex")]),t._v(" "),s("li",[t._v("根据 d1.s1 的 TimeseriesIndex,反序列化其所有 ChunkIndex")]),t._v(" "),s("li",[t._v("根据 d1.s1 的每一个 ChunkIndex,读取其 Chunk 数据")])]),t._v(" "),s("h4",{attrs:{id:"_1-2-1-文件签名和版本号"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-2-1-文件签名和版本号"}},[t._v("#")]),t._v(" 1.2.1 文件签名和版本号")]),t._v(" "),s("p",[t._v('TsFile文件头由 6 个字节的 "Magic String" ('),s("code",[t._v("TsFile")]),t._v(") 和 6 个字节的版本号 ("),s("code",[t._v("000002")]),t._v(")组成。")]),t._v(" "),s("h4",{attrs:{id:"_1-2-2-数据区"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-2-2-数据区"}},[t._v("#")]),t._v(" 1.2.2 数据区")]),t._v(" "),s("h5",{attrs:{id:"chunkgroup-数据块组"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#chunkgroup-数据块组"}},[t._v("#")]),t._v(" ChunkGroup 数据块组")]),t._v(" "),s("p",[s("code",[t._v("ChunkGroup")]),t._v(" 存储了一个实体(Entity) 一段时间的数据。由若干个 "),s("code",[t._v("Chunk")]),t._v(", 一个字节的分隔符 "),s("code",[t._v("0x00")]),t._v(" 和 一个"),s("code",[t._v("ChunkFooter")]),t._v("组成。")]),t._v(" "),s("h5",{attrs:{id:"chunk-数据块"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#chunk-数据块"}},[t._v("#")]),t._v(" Chunk 数据块")]),t._v(" "),s("p",[t._v("一个 "),s("code",[t._v("Chunk")]),t._v(" 存储了一个物理量(Measurement) 一段时间的数据,Chunk 内数据是按时间递增序存储的。"),s("code",[t._v("Chunk")]),t._v(" 是由一个字节的分隔符 "),s("code",[t._v("0x01")]),t._v(", 一个 "),s("code",[t._v("ChunkHeader")]),t._v(" 和若干个 "),s("code",[t._v("Page")]),t._v(" 构成。")]),t._v(" "),s("h5",{attrs:{id:"chunkheader-数据块头"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#chunkheader-数据块头"}},[t._v("#")]),t._v(" ChunkHeader 数据块头")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",{staticStyle:{"text-align":"center"}},[t._v("成员")]),t._v(" "),s("th",{staticStyle:{"text-align":"center"}},[t._v("类型")]),t._v(" "),s("th",{staticStyle:{"text-align":"center"}},[t._v("解释")])])]),t._v(" "),s("tbody",[s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("measurementID")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("String")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("传感器名称")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("dataSize")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("int")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("chunk 大小")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("dataType")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("TSDataType")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("chunk的数据类型")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("compressionType")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("CompressionType")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("压缩类型")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("encodingType")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("TSEncoding")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("编码类型")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("numOfPages")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("int")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("包含的page数量")])])])]),t._v(" "),s("h5",{attrs:{id:"page-数据页"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#page-数据页"}},[t._v("#")]),t._v(" Page 数据页")]),t._v(" "),s("p",[t._v("一个 "),s("code",[t._v("Page")]),t._v(" 页存储了一段时间序列,是数据块被反序列化的最小单元。 它包含一个 "),s("code",[t._v("PageHeader")]),t._v(" 和实际的数据(time-value 编码的键值对)。")]),t._v(" "),s("p",[t._v("PageHeader 结构:")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",{staticStyle:{"text-align":"center"}},[t._v("成员")]),t._v(" "),s("th",{staticStyle:{"text-align":"center"}},[t._v("类型")]),t._v(" "),s("th",{staticStyle:{"text-align":"center"}},[t._v("解释")])])]),t._v(" "),s("tbody",[s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("uncompressedSize")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("int")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("压缩前数据大小")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("compressedSize")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("int")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("SNAPPY压缩后数据大小")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("statistics")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Statistics")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("统计量")])])])]),t._v(" "),s("p",[t._v("这里是"),s("code",[t._v("statistics")]),t._v("的详细信息:")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",{staticStyle:{"text-align":"center"}},[t._v("成员")]),t._v(" "),s("th",{staticStyle:{"text-align":"center"}},[t._v("描述")]),t._v(" "),s("th",{staticStyle:{"text-align":"center"}},[t._v("DoubleStatistics")]),t._v(" "),s("th",{staticStyle:{"text-align":"center"}},[t._v("FloatStatistics")]),t._v(" "),s("th",{staticStyle:{"text-align":"center"}},[t._v("IntegerStatistics")]),t._v(" "),s("th",{staticStyle:{"text-align":"center"}},[t._v("LongStatistics")]),t._v(" "),s("th",{staticStyle:{"text-align":"center"}},[t._v("BinaryStatistics")]),t._v(" "),s("th",{staticStyle:{"text-align":"center"}},[t._v("BooleanStatistics")])])]),t._v(" "),s("tbody",[s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("count")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("数据点个数")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("long")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("long")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("long")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("long")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("long")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("long")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("startTime")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("开始时间")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("long")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("long")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("long")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("long")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("long")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("long")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("endTime")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("结束时间")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("long")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("long")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("long")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("long")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("long")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("long")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("minValue")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("最小值")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("double")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("float")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("int")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("long")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("-")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("-")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("maxValue")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("最大值")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("double")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("float")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("int")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("long")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("-")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("-")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("firstValue")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("第一个值")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("double")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("float")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("int")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("long")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Binary")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("boolean")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("lastValue")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("最后一个值")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("double")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("float")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("int")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("long")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Binary")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("boolean")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("sumValue")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("和")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("double")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("double")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("double")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("double")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("-")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("-")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("extreme")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("极值")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("double")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("float")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("int")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("long")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("-")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("-")])])])]),t._v(" "),s("h5",{attrs:{id:"chunkgroupfooter-数据块组结尾"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#chunkgroupfooter-数据块组结尾"}},[t._v("#")]),t._v(" ChunkGroupFooter 数据块组结尾")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",{staticStyle:{"text-align":"center"}},[t._v("成员")]),t._v(" "),s("th",{staticStyle:{"text-align":"center"}},[t._v("类型")]),t._v(" "),s("th",{staticStyle:{"text-align":"center"}},[t._v("解释")])])]),t._v(" "),s("tbody",[s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("entityID")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("String")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("实体名称")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("dataSize")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("long")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("ChunkGroup 大小")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("numberOfChunks")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("int")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("包含的 chunks 的数量")])])])]),t._v(" "),s("h4",{attrs:{id:"_1-2-3-索引区"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-2-3-索引区"}},[t._v("#")]),t._v(" 1.2.3 索引区")]),t._v(" "),s("h5",{attrs:{id:"_1-2-3-1-chunkindex-数据块索引"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-2-3-1-chunkindex-数据块索引"}},[t._v("#")]),t._v(" 1.2.3.1 ChunkIndex 数据块索引")]),t._v(" "),s("p",[t._v("第一部分的索引是 "),s("code",[t._v("ChunkIndex")]),t._v(" :")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",{staticStyle:{"text-align":"center"}},[t._v("成员")]),t._v(" "),s("th",{staticStyle:{"text-align":"center"}},[t._v("类型")]),t._v(" "),s("th",{staticStyle:{"text-align":"center"}},[t._v("解释")])])]),t._v(" "),s("tbody",[s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("measurementUid")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("String")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("传感器名称")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("offsetOfChunkHeader")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("long")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("文件中 ChunkHeader 开始的偏移量")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("tsDataType")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("TSDataType")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("数据类型")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("statistics")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Statistics")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("统计量")])])])]),t._v(" "),s("h5",{attrs:{id:"_1-2-3-2-timeseriesindex-时间序列索引"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-2-3-2-timeseriesindex-时间序列索引"}},[t._v("#")]),t._v(" 1.2.3.2 TimeseriesIndex 时间序列索引")]),t._v(" "),s("p",[t._v("第二部分的索引是 "),s("code",[t._v("TimeseriesIndex")]),t._v(":")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",{staticStyle:{"text-align":"center"}},[t._v("成员")]),t._v(" "),s("th",{staticStyle:{"text-align":"center"}},[t._v("类型")]),t._v(" "),s("th",{staticStyle:{"text-align":"center"}},[t._v("解释")])])]),t._v(" "),s("tbody",[s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("measurementUid")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("String")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("物理量名称")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("tsDataType")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("TSDataType")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("数据类型")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("startOffsetOfChunkIndexList")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("long")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("文件中 ChunkIndex 列表开始的偏移量")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("ChunkIndexListDataSize")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("int")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("ChunkIndex 列表的大小")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("statistics")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Statistics")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("统计量")])])])]),t._v(" "),s("h5",{attrs:{id:"_1-2-3-3-indexoftimeseriesindex-时间序列索引的索引-二级索引"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-2-3-3-indexoftimeseriesindex-时间序列索引的索引-二级索引"}},[t._v("#")]),t._v(" 1.2.3.3 IndexOfTimeseriesIndex 时间序列索引的索引(二级索引)")]),t._v(" "),s("p",[t._v("第三部分的索引是 "),s("code",[t._v("IndexOfTimeseriesIndex")]),t._v(":")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",{staticStyle:{"text-align":"center"}},[t._v("成员")]),t._v(" "),s("th",{staticStyle:{"text-align":"center"}},[t._v("类型")]),t._v(" "),s("th",{staticStyle:{"text-align":"center"}},[t._v("解释")])])]),t._v(" "),s("tbody",[s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("IndexTree")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("IndexNode")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("索引节点")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("offsetOfIndexArea")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("long")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("索引区的偏移量")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("bloomFilter")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("BloomFilter")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("布隆过滤器")])])])]),t._v(" "),s("p",[t._v("索引节点 (IndexNode) 的成员和类型具体如下:")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",{staticStyle:{"text-align":"center"}},[t._v("成员")]),t._v(" "),s("th",{staticStyle:{"text-align":"center"}},[t._v("类型")]),t._v(" "),s("th",{staticStyle:{"text-align":"center"}},[t._v("解释")])])]),t._v(" "),s("tbody",[s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("children")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("List"),s("IndexEntry")],1),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("节点索引项列表")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("endOffset")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("long")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("此索引节点的结束偏移量")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("nodeType")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("IndexNodeType")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("节点类型")])])])]),t._v(" "),s("p",[t._v("索引项 (MetadataIndexEntry) 的成员和类型具体如下:")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",{staticStyle:{"text-align":"center"}},[t._v("成员")]),t._v(" "),s("th",{staticStyle:{"text-align":"center"}},[t._v("类型")]),t._v(" "),s("th",{staticStyle:{"text-align":"center"}},[t._v("解释")])])]),t._v(" "),s("tbody",[s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("name")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("String")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("对应实体或物理量的名字")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("offset")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("long")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("偏移量")])])])]),t._v(" "),s("p",[t._v("所有的索引节点构成一棵类B+树结构的"),s("strong",[t._v("索引树(二级索引)")]),t._v(",这棵树由两部分组成:实体索引部分和物理量索引部分。索引节点类型有四种,分别是"),s("code",[t._v("INTERNAL_ENTITY")]),t._v("、"),s("code",[t._v("LEAF_ENTITY")]),t._v("、"),s("code",[t._v("INTERNAL_MEASUREMENT")]),t._v("、"),s("code",[t._v("LEAF_MEASUREMENT")]),t._v(",分别对应实体索引部分的中间节点和叶子节点,和物理量索引部分的中间节点和叶子节点。 只有物理量索引部分的叶子节点("),s("code",[t._v("LEAF_MEASUREMENT")]),t._v(") 指向 "),s("code",[t._v("TimeseriesIndex")]),t._v("。")]),t._v(" "),s("p",[t._v("下面,我们使用四个例子来加以详细说明。")]),t._v(" "),s("p",[t._v("索引树节点的度(即每个节点的最大子节点个数)可以由用户进行配置,配置项为"),s("code",[t._v("max_degree_of_index_node")]),t._v(",其默认值为256。在以下例子中,我们假定 "),s("code",[t._v("max_degree_of_index_node = 10")]),t._v("。")]),t._v(" "),s("ul",[s("li",[t._v("例1:5个实体,每个实体有5个物理量")])]),t._v(" "),s("img",{staticStyle:{width:"100%","max-width":"800px","max-height":"600px","margin-left":"auto","margin-right":"auto",display:"block"},attrs:{src:"https://user-images.githubusercontent.com/19167280/125254013-9d2d7400-e32c-11eb-9f95-1663e14cffbb.png"}}),t._v(" "),s("p",[t._v("在5个实体,每个实体有5个物理量的情况下,由于实体数和物理量数均不超过 "),s("code",[t._v("max_degree_of_index_node")]),t._v(",因此索引树只有默认的物理量部分。在这部分中,每个 IndexNode 最多由10个 IndexEntry 组成。根节点是 "),s("code",[t._v("LEAF_ENTITY")]),t._v(" 类型,其中的5个 IndexEntry 指向对应的实体的 IndexNode,这些节点直接指向 "),s("code",[t._v("TimeseriesIndex")]),t._v(",是 "),s("code",[t._v("LEAF_MEASUREMENT")]),t._v("。")]),t._v(" "),s("ul",[s("li",[t._v("例2:1个实体,150个物理量")])]),t._v(" "),s("img",{staticStyle:{width:"100%","max-width":"800px","max-height":"600px","margin-left":"auto","margin-right":"auto",display:"block"},attrs:{src:"https://user-images.githubusercontent.com/19167280/125254022-a0c0fb00-e32c-11eb-8fd1-462936358288.png"}}),t._v(" "),s("p",[t._v("在1个实体,实体中有150个物理量的情况下,物理量个数超过了 "),s("code",[t._v("max_degree_of_index_node")]),t._v(",索引树有默认的物理量层级。在这个层级里,每个 IndexNode 最多由10个 IndexEntry 组成。直接指向 "),s("code",[t._v("TimeseriesIndex")]),t._v("的节点类型均为 "),s("code",[t._v("LEAF_MEASUREMENT")]),t._v(";而后续产生的中间节点不是物理量索引层级的叶子节点,这些节点是 "),s("code",[t._v("INTERNAL_MEASUREMENT")]),t._v(";根节点是 "),s("code",[t._v("LEAF_ENTITY")]),t._v(" 类型。")]),t._v(" "),s("ul",[s("li",[t._v("例3:150个实体,每个实体有1个物理量")])]),t._v(" "),s("img",{staticStyle:{width:"100%","max-width":"800px","max-height":"600px","margin-left":"auto","margin-right":"auto",display:"block"},attrs:{src:"https://user-images.githubusercontent.com/19167280/122771008-9a64d380-d2d8-11eb-9044-5ac794dd38f7.png"}}),t._v(" "),s("p",[t._v("在150个实体,每个实体中有1个物理量的情况下,实体个数超过了 "),s("code",[t._v("max_degree_of_index_node")]),t._v(",形成索引树的物理量层级和实体索引层级。在这两个层级里,每个 IndexNode 最多由10个 IndexEntry 组成。直接指向 "),s("code",[t._v("TimeseriesIndex")]),t._v(" 的节点类型为 "),s("code",[t._v("LEAF_MEASUREMENT")]),t._v(",物理量索引层级的根节点同时作为实体索引层级的叶子节点,其节点类型为 "),s("code",[t._v("LEAF_ENTITY")]),t._v(";而后续产生的中间节点和根节点不是实体索引层级的叶子节点,因此节点类型为 "),s("code",[t._v("INTERNAL_ENTITY")]),t._v("。")]),t._v(" "),s("ul",[s("li",[t._v("例4:150个实体,每个实体有150个物理量")])]),t._v(" "),s("img",{staticStyle:{width:"100%","max-width":"800px","max-height":"600px","margin-left":"auto","margin-right":"auto",display:"block"},attrs:{src:"https://user-images.githubusercontent.com/19167280/122677241-1a753580-d214-11eb-817f-17bcf797251f.png"}}),t._v(" "),s("p",[t._v("在150个实体,每个实体中有150个物理量的情况下,物理量和实体个数均超过了 "),s("code",[t._v("max_degree_of_index_node")]),t._v(",形成索引树的物理量层级和实体索引层级。在这两个层级里,每个 IndexNode 均最多由10个 IndexEntry 组成。如前所述,从根节点到实体索引层级的叶子节点,类型分别为"),s("code",[t._v("INTERNAL_ENTITY")]),t._v(" 和 "),s("code",[t._v("LEAF_ENTITY")]),t._v(",而每个实体索引层级的叶子节点都是物理量索引层级的根节点,从这里到物理量索引层级的叶子节点,类型分别为"),s("code",[t._v("INTERNAL_MEASUREMENT")]),t._v(" 和 "),s("code",[t._v("LEAF_MEASUREMENT")]),t._v("。")]),t._v(" "),s("p",[t._v("索引采用树形结构进行设计的目的是在实体数或者物理量数量过大时,可以不用一次读取所有的 "),s("code",[t._v("TimeseriesIndex")]),t._v(",只需要根据所读取的物理量定位对应的节点,从而减少 I/O,加快查询速度。有关 TsFile 的读流程将在本章最后一节加以详细说明。")]),t._v(" "),s("h4",{attrs:{id:"_1-2-4-magic-string"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-2-4-magic-string"}},[t._v("#")]),t._v(" 1.2.4 Magic String")]),t._v(" "),s("p",[t._v("TsFile 是以6个字节的magic string ("),s("code",[t._v("TsFile")]),t._v(") 作为结束。")]),t._v(" "),s("p",[t._v("恭喜您, 至此您已经完成了 TsFile 的探秘之旅,祝您玩儿的开心!")]),t._v(" "),s("h2",{attrs:{id:"_2-tsfile-的总览图"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_2-tsfile-的总览图"}},[t._v("#")]),t._v(" 2 TsFile 的总览图")]),t._v(" "),s("h3",{attrs:{id:"v0-8"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#v0-8"}},[t._v("#")]),t._v(" v0.8")]),t._v(" "),s("img",{staticStyle:{width:"100%","max-width":"800px","max-height":"600px","margin-left":"auto","margin-right":"auto",display:"block"},attrs:{src:"https://user-images.githubusercontent.com/33376433/65209576-2bd36000-dacb-11e9-9e43-49e0dd01274e.png"}}),t._v(" "),s("h3",{attrs:{id:"v0-9-000001"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#v0-9-000001"}},[t._v("#")]),t._v(" v0.9 / 000001")]),t._v(" "),s("img",{staticStyle:{width:"100%","max-width":"800px","max-height":"600px","margin-left":"auto","margin-right":"auto",display:"block"},attrs:{src:"https://user-images.githubusercontent.com/33376433/69341240-26012300-0ca4-11ea-91a1-d516810cad44.png"}}),t._v(" "),s("h3",{attrs:{id:"v0-10-000002"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#v0-10-000002"}},[t._v("#")]),t._v(" v0.10 / 000002")]),t._v(" "),s("img",{staticStyle:{width:"100%","max-width":"800px","max-height":"600px","margin-left":"auto","margin-right":"auto",display:"block"},attrs:{src:"https://user-images.githubusercontent.com/19167280/95296983-492cc500-08ac-11eb-9f66-c9c78401c61d.png"}}),t._v(" "),s("h3",{attrs:{id:"v0-12-000003"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#v0-12-000003"}},[t._v("#")]),t._v(" v0.12 / 000003")]),t._v(" "),s("img",{staticStyle:{width:"100%","max-width":"800px","max-height":"600px","margin-left":"auto","margin-right":"auto",display:"block"},attrs:{src:"https://user-images.githubusercontent.com/33376433/123052025-f47aab80-d434-11eb-94c2-9b75429e5c54.png"}}),t._v(" "),s("h2",{attrs:{id:"_3-tsfile工具集"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_3-tsfile工具集"}},[t._v("#")]),t._v(" 3 TsFile工具集")]),t._v(" "),s("h3",{attrs:{id:"_3-1-iotdb-data-directory-快速概览工具"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_3-1-iotdb-data-directory-快速概览工具"}},[t._v("#")]),t._v(" 3.1 IoTDB Data Directory 快速概览工具")]),t._v(" "),s("p",[t._v("该工具的启动脚本会在编译 server 之后生成至 "),s("code",[t._v("server\\target\\iotdb-server-{version}\\tools\\tsfileToolSet")]),t._v(" 目录中。")]),t._v(" "),s("p",[t._v("使用方式:")]),t._v(" "),s("p",[t._v("For Windows:")]),t._v(" "),s("div",{staticClass:"language- line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v(".\\print-iotdb-data-dir.bat <IoTDB数据文件夹路径,如果是多个文件夹用逗号分隔> (<输出结果的存储路径>) \n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br")])]),s("p",[t._v("For Linux or MacOs:")]),t._v(" "),s("div",{staticClass:"language- line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("./print-iotdb-data-dir.sh <IoTDB数据文件夹路径,如果是多个文件夹用逗号分隔> (<输出结果的存储路径>) \n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br")])]),s("p",[t._v("在Windows系统中的示例:")]),t._v(" "),s("div",{staticClass:"language- line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("D:\\iotdb\\server\\target\\iotdb-server-{version}\\tools\\tsfileToolSet>.\\print-iotdb-data-dir.bat D:\\\\data\\data\n|````````````````````````\nStarting Printing the IoTDB Data Directory Overview\n|````````````````````````\noutput save path:IoTDB_data_dir_overview.txt\nTsFile data dir num:1\n21:17:38.841 [main] WARN org.apache.iotdb.tsfile.common.conf.TSFileDescriptor - Failed to find config file iotdb-engine.properties at classpath, use default configuration\n|==============================================================\n|D:\\\\data\\data\n|--sequence\n| |--root.ln.wf01.wt01\n| | |--1575813520203-101-0.tsfile\n| | |--1575813520203-101-0.tsfile.resource\n| | | |--device root.ln.wf01.wt01, start time 1 (1970-01-01T08:00:00.001+08:00[GMT+08:00]), end time 5 (1970-01-01T08:00:00.005+08:00[GMT+08:00])\n| | |--1575813520669-103-0.tsfile\n| | |--1575813520669-103-0.tsfile.resource\n| | | |--device root.ln.wf01.wt01, start time 100 (1970-01-01T08:00:00.100+08:00[GMT+08:00]), end time 300 (1970-01-01T08:00:00.300+08:00[GMT+08:00])\n| | |--1575813521372-107-0.tsfile\n| | |--1575813521372-107-0.tsfile.resource\n| | | |--device root.ln.wf01.wt01, start time 500 (1970-01-01T08:00:00.500+08:00[GMT+08:00]), end time 540 (1970-01-01T08:00:00.540+08:00[GMT+08:00])\n|--unsequence\n| |--root.ln.wf01.wt01\n| | |--1575813521063-105-0.tsfile\n| | |--1575813521063-105-0.tsfile.resource\n| | | |--device root.ln.wf01.wt01, start time 10 (1970-01-01T08:00:00.010+08:00[GMT+08:00]), end time 50 (1970-01-01T08:00:00.050+08:00[GMT+08:00])\n|==============================================================\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br")])]),s("h3",{attrs:{id:"_3-2-tsfileresource-打印工具"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_3-2-tsfileresource-打印工具"}},[t._v("#")]),t._v(" 3.2 TsFileResource 打印工具")]),t._v(" "),s("p",[t._v("该工具的启动脚本会在编译 server 之后生成至 "),s("code",[t._v("server\\target\\iotdb-server-{version}\\tools\\tsfileToolSet")]),t._v(" 目录中。")]),t._v(" "),s("p",[t._v("使用方式:")]),t._v(" "),s("p",[t._v("Windows:")]),t._v(" "),s("div",{staticClass:"language- line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v(".\\print-tsfile-resource-files.bat <TsFileResource文件夹路径>\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br")])]),s("p",[t._v("Linux or MacOs:")]),t._v(" "),s("div",{staticClass:"language- line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("./print-tsfile-resource-files.sh <TsFileResource文件夹路径>\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br")])]),s("p",[t._v("在Windows系统中的示例:")]),t._v(" "),s("div",{staticClass:"language- line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("D:\\iotdb\\server\\target\\iotdb-server-{version}\\tools\\tsfileToolSet>.\\print-tsfile-resource-files.bat D:\\data\\data\\sequence\\root.vehicle\n|````````````````````````\nStarting Printing the TsFileResources\n|````````````````````````\n12:31:59.861 [main] WARN org.apache.iotdb.db.conf.IoTDBDescriptor - Cannot find IOTDB_HOME or IOTDB_CONF environment variable when loading config file iotdb-engine.properties, use default configuration\nanalyzing D:\\data\\data\\sequence\\root.vehicle\\1572496142067-101-0.tsfile ...\ndevice root.vehicle.d0, start time 3000 (1970-01-01T08:00:03+08:00[GMT+08:00]), end time 100999 (1970-01-01T08:01:40.999+08:00[GMT+08:00])\nanalyzing the resource file finished.\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br")])]),s("h3",{attrs:{id:"_3-3-tsfile-描述工具"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_3-3-tsfile-描述工具"}},[t._v("#")]),t._v(" 3.3 TsFile 描述工具")]),t._v(" "),s("p",[t._v("该工具的启动脚本会在编译 server 之后生成至 "),s("code",[t._v("server\\target\\iotdb-server-{version}\\tools\\tsfileToolSet")]),t._v(" 目录中。")]),t._v(" "),s("p",[t._v("使用方式:")]),t._v(" "),s("p",[t._v("Windows:")]),t._v(" "),s("div",{staticClass:"language- line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v(".\\print-tsfile-sketch.bat <TsFile文件路径> (<输出结果的存储路径>) \n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br")])]),s("ul",[s("li",[t._v('注意: 如果没有设置输出文件的存储路径, 将使用 "TsFile_sketch_view.txt" 做为默认值。')])]),t._v(" "),s("p",[t._v("Linux or MacOs:")]),t._v(" "),s("div",{staticClass:"language- line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("./print-tsfile-sketch.sh <TsFile文件路径> (<输出结果的存储路径>) \n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br")])]),s("ul",[s("li",[t._v('注意: 如果没有设置输出文件的存储路径, 将使用 "TsFile_sketch_view.txt" 做为默认值。')])]),t._v(" "),s("p",[t._v("在mac系统中的示例:")]),t._v(" "),s("div",{staticClass:"language- line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("/iotdb/server/target/iotdb-server-{version}/tools/tsfileToolSet$ ./print-tsfile-sketch.sh test.tsfile\n|````````````````````````\nStarting Printing the TsFile Sketch\n|````````````````````````\nTsFile path:test.tsfile\nSketch save path:TsFile_sketch_view.txt\n-------------------------------- TsFile Sketch --------------------------------\nfile path: test.tsfile\nfile length: 33436\n\n POSITION| CONTENT\n -------- -------\n 0| [magic head] TsFile\n 6| [version number] 000002\n||||||||||||||||||||| [Chunk Group] of root.group_12.d2, num of Chunks:3\n 12| [Chunk] of s_INT64e_RLE, numOfPoints:10000, time range:[1,10000], tsDataType:INT64, \n startTime: 1 endTime: 10000 count: 10000 [minValue:1,maxValue:1,firstValue:1,lastValue:1,sumValue:10000.0]\n | [marker] 1\n | [ChunkHeader]\n | 2 pages\n 677| [Chunk] of s_INT64e_TS_2DIFF, numOfPoints:10000, time range:[1,10000], tsDataType:INT64, \n startTime: 1 endTime: 10000 count: 10000 [minValue:1,maxValue:1,firstValue:1,lastValue:1,sumValue:10000.0]\n | [marker] 1\n | [ChunkHeader]\n | 1 pages\n 1349| [Chunk] of s_INT64e_PLAIN, numOfPoints:10000, time range:[1,10000], tsDataType:INT64, \n startTime: 1 endTime: 10000 count: 10000 [minValue:1,maxValue:1,firstValue:1,lastValue:1,sumValue:10000.0]\n | [marker] 1\n | [ChunkHeader]\n | 2 pages\n 5766| [Chunk Group Footer]\n | [marker] 0\n | [deviceID] root.group_12.d2\n | [dataSize] 5754\n | [num of chunks] 3\n||||||||||||||||||||| [Chunk Group] of root.group_12.d2 ends\n 5799| [Version Info]\n | [marker] 3\n | [version] 102\n||||||||||||||||||||| [Chunk Group] of root.group_12.d1, num of Chunks:3\n 5808| [Chunk] of s_INT32e_PLAIN, numOfPoints:10000, time range:[1,10000], tsDataType:INT32, \n startTime: 1 endTime: 10000 count: 10000 [minValue:1,maxValue:1,firstValue:1,lastValue:1,sumValue:10000.0]\n | [marker] 1\n | [ChunkHeader]\n | 1 pages\n 8231| [Chunk] of s_INT32e_TS_2DIFF, numOfPoints:10000, time range:[1,10000], tsDataType:INT32, \n startTime: 1 endTime: 10000 count: 10000 [minValue:1,maxValue:1,firstValue:1,lastValue:1,sumValue:10000.0]\n | [marker] 1\n | [ChunkHeader]\n | 1 pages\n 8852| [Chunk] of s_INT32e_RLE, numOfPoints:10000, time range:[1,10000], tsDataType:INT32, \n startTime: 1 endTime: 10000 count: 10000 [minValue:1,maxValue:1,firstValue:1,lastValue:1,sumValue:10000.0]\n | [marker] 1\n | [ChunkHeader]\n | 1 pages\n 9399| [Chunk Group Footer]\n | [marker] 0\n | [deviceID] root.group_12.d1\n | [dataSize] 3591\n | [num of chunks] 3\n||||||||||||||||||||| [Chunk Group] of root.group_12.d1 ends\n 9432| [Version Info]\n | [marker] 3\n | [version] 102\n||||||||||||||||||||| [Chunk Group] of root.group_12.d0, num of Chunks:2\n 9441| [Chunk] of s_BOOLEANe_RLE, numOfPoints:10000, time range:[1,10000], tsDataType:BOOLEAN, \n startTime: 1 endTime: 10000 count: 10000 [firstValue:true,lastValue:true]\n | [marker] 1\n | [ChunkHeader]\n | 1 pages\n 9968| [Chunk] of s_BOOLEANe_PLAIN, numOfPoints:10000, time range:[1,10000], tsDataType:BOOLEAN, \n startTime: 1 endTime: 10000 count: 10000 [firstValue:true,lastValue:true]\n | [marker] 1\n | [ChunkHeader]\n | 1 pages\n 10961| [Chunk Group Footer]\n | [marker] 0\n | [deviceID] root.group_12.d0\n | [dataSize] 1520\n | [num of chunks] 2\n||||||||||||||||||||| [Chunk Group] of root.group_12.d0 ends\n 10994| [Version Info]\n | [marker] 3\n | [version] 102\n||||||||||||||||||||| [Chunk Group] of root.group_12.d5, num of Chunks:1\n 11003| [Chunk] of s_TEXTe_PLAIN, numOfPoints:10000, time range:[1,10000], tsDataType:TEXT, \n startTime: 1 endTime: 10000 count: 10000 [firstValue:version_test,lastValue:version_test]\n | [marker] 1\n | [ChunkHeader]\n | 3 pages\n 19278| [Chunk Group Footer]\n | [marker] 0\n | [deviceID] root.group_12.d5\n | [dataSize] 8275\n | [num of chunks] 1\n||||||||||||||||||||| [Chunk Group] of root.group_12.d5 ends\n 19311| [Version Info]\n | [marker] 3\n | [version] 102\n||||||||||||||||||||| [Chunk Group] of root.group_12.d4, num of Chunks:4\n 19320| [Chunk] of s_DOUBLEe_PLAIN, numOfPoints:10000, time range:[1,10000], tsDataType:DOUBLE, \n startTime: 1 endTime: 10000 count: 10000 [minValue:1.1,maxValue:1.1,firstValue:1.1,lastValue:1.1,sumValue:11000.00000000123]\n | [marker] 1\n | [ChunkHeader]\n | 2 pages\n 23740| [Chunk] of s_DOUBLEe_TS_2DIFF, numOfPoints:10000, time range:[1,10000], tsDataType:DOUBLE, \n startTime: 1 endTime: 10000 count: 10000 [minValue:1.1,maxValue:1.1,firstValue:1.1,lastValue:1.1,sumValue:11000.000000002045]\n | [marker] 1\n | [ChunkHeader]\n | 1 pages\n 24414| [Chunk] of s_DOUBLEe_GORILLA, numOfPoints:10000, time range:[1,10000], tsDataType:DOUBLE, \n startTime: 1 endTime: 10000 count: 10000 [minValue:1.1,maxValue:1.1,firstValue:1.1,lastValue:1.1,sumValue:11000.000000002045]\n | [marker] 1\n | [ChunkHeader]\n | 1 pages\n 25054| [Chunk] of s_DOUBLEe_RLE, numOfPoints:10000, time range:[1,10000], tsDataType:DOUBLE, \n startTime: 1 endTime: 10000 count: 10000 [minValue:1.1,maxValue:1.1,firstValue:1.1,lastValue:1.1,sumValue:11000.000000001224]\n | [marker] 1\n | [ChunkHeader]\n | 2 pages\n 25717| [Chunk Group Footer]\n | [marker] 0\n | [deviceID] root.group_12.d4\n | [dataSize] 6397\n | [num of chunks] 4\n||||||||||||||||||||| [Chunk Group] of root.group_12.d4 ends\n 25750| [Version Info]\n | [marker] 3\n | [version] 102\n||||||||||||||||||||| [Chunk Group] of root.group_12.d3, num of Chunks:4\n 25759| [Chunk] of s_FLOATe_GORILLA, numOfPoints:10000, time range:[1,10000], tsDataType:FLOAT, \n startTime: 1 endTime: 10000 count: 10000 [minValue:1.1,maxValue:1.1,firstValue:1.1,lastValue:1.1,sumValue:11000.00023841858]\n | [marker] 1\n | [ChunkHeader]\n | 1 pages\n 26375| [Chunk] of s_FLOATe_PLAIN, numOfPoints:10000, time range:[1,10000], tsDataType:FLOAT, \n startTime: 1 endTime: 10000 count: 10000 [minValue:1.1,maxValue:1.1,firstValue:1.1,lastValue:1.1,sumValue:11000.00023841858]\n | [marker] 1\n | [ChunkHeader]\n | 1 pages\n 28796| [Chunk] of s_FLOATe_RLE, numOfPoints:10000, time range:[1,10000], tsDataType:FLOAT, \n startTime: 1 endTime: 10000 count: 10000 [minValue:1.1,maxValue:1.1,firstValue:1.1,lastValue:1.1,sumValue:11000.00023841858]\n | [marker] 1\n | [ChunkHeader]\n | 1 pages\n 29343| [Chunk] of s_FLOATe_TS_2DIFF, numOfPoints:10000, time range:[1,10000], tsDataType:FLOAT, \n startTime: 1 endTime: 10000 count: 10000 [minValue:1.1,maxValue:1.1,firstValue:1.1,lastValue:1.1,sumValue:11000.00023841858]\n | [marker] 1\n | [ChunkHeader]\n | 1 pages\n 29967| [Chunk Group Footer]\n | [marker] 0\n | [deviceID] root.group_12.d3\n | [dataSize] 4208\n | [num of chunks] 4\n||||||||||||||||||||| [Chunk Group] of root.group_12.d3 ends\n 30000| [Version Info]\n | [marker] 3\n | [version] 102\n 30009| [marker] 2\n 30010| [ChunkMetadataList] of root.group_12.d0.s_BOOLEANe_PLAIN, tsDataType:BOOLEAN\n | [startTime: 1 endTime: 10000 count: 10000 [firstValue:true,lastValue:true]] \n 30066| [ChunkMetadataList] of root.group_12.d0.s_BOOLEANe_RLE, tsDataType:BOOLEAN\n | [startTime: 1 endTime: 10000 count: 10000 [firstValue:true,lastValue:true]] \n 30120| [ChunkMetadataList] of root.group_12.d1.s_INT32e_PLAIN, tsDataType:INT32\n | [startTime: 1 endTime: 10000 count: 10000 [minValue:1,maxValue:1,firstValue:1,lastValue:1,sumValue:10000.0]] \n 30196| [ChunkMetadataList] of root.group_12.d1.s_INT32e_RLE, tsDataType:INT32\n | [startTime: 1 endTime: 10000 count: 10000 [minValue:1,maxValue:1,firstValue:1,lastValue:1,sumValue:10000.0]] \n 30270| [ChunkMetadataList] of root.group_12.d1.s_INT32e_TS_2DIFF, tsDataType:INT32\n | [startTime: 1 endTime: 10000 count: 10000 [minValue:1,maxValue:1,firstValue:1,lastValue:1,sumValue:10000.0]] \n 30349| [ChunkMetadataList] of root.group_12.d2.s_INT64e_PLAIN, tsDataType:INT64\n | [startTime: 1 endTime: 10000 count: 10000 [minValue:1,maxValue:1,firstValue:1,lastValue:1,sumValue:10000.0]] \n 30441| [ChunkMetadataList] of root.group_12.d2.s_INT64e_RLE, tsDataType:INT64\n | [startTime: 1 endTime: 10000 count: 10000 [minValue:1,maxValue:1,firstValue:1,lastValue:1,sumValue:10000.0]] \n 30531| [ChunkMetadataList] of root.group_12.d2.s_INT64e_TS_2DIFF, tsDataType:INT64\n | [startTime: 1 endTime: 10000 count: 10000 [minValue:1,maxValue:1,firstValue:1,lastValue:1,sumValue:10000.0]] \n 30626| [ChunkMetadataList] of root.group_12.d3.s_FLOATe_GORILLA, tsDataType:FLOAT\n | [startTime: 1 endTime: 10000 count: 10000 [minValue:1.1,maxValue:1.1,firstValue:1.1,lastValue:1.1,sumValue:11000.00023841858]] \n 30704| [ChunkMetadataList] of root.group_12.d3.s_FLOATe_PLAIN, tsDataType:FLOAT\n | [startTime: 1 endTime: 10000 count: 10000 [minValue:1.1,maxValue:1.1,firstValue:1.1,lastValue:1.1,sumValue:11000.00023841858]] \n 30780| [ChunkMetadataList] of root.group_12.d3.s_FLOATe_RLE, tsDataType:FLOAT\n | [startTime: 1 endTime: 10000 count: 10000 [minValue:1.1,maxValue:1.1,firstValue:1.1,lastValue:1.1,sumValue:11000.00023841858]] \n 30854| [ChunkMetadataList] of root.group_12.d3.s_FLOATe_TS_2DIFF, tsDataType:FLOAT\n | [startTime: 1 endTime: 10000 count: 10000 [minValue:1.1,maxValue:1.1,firstValue:1.1,lastValue:1.1,sumValue:11000.00023841858]] \n 30933| [ChunkMetadataList] of root.group_12.d4.s_DOUBLEe_GORILLA, tsDataType:DOUBLE\n | [startTime: 1 endTime: 10000 count: 10000 [minValue:1.1,maxValue:1.1,firstValue:1.1,lastValue:1.1,sumValue:11000.000000002045]] \n 31028| [ChunkMetadataList] of root.group_12.d4.s_DOUBLEe_PLAIN, tsDataType:DOUBLE\n | [startTime: 1 endTime: 10000 count: 10000 [minValue:1.1,maxValue:1.1,firstValue:1.1,lastValue:1.1,sumValue:11000.00000000123]] \n 31121| [ChunkMetadataList] of root.group_12.d4.s_DOUBLEe_RLE, tsDataType:DOUBLE\n | [startTime: 1 endTime: 10000 count: 10000 [minValue:1.1,maxValue:1.1,firstValue:1.1,lastValue:1.1,sumValue:11000.000000001224]] \n 31212| [ChunkMetadataList] of root.group_12.d4.s_DOUBLEe_TS_2DIFF, tsDataType:DOUBLE\n | [startTime: 1 endTime: 10000 count: 10000 [minValue:1.1,maxValue:1.1,firstValue:1.1,lastValue:1.1,sumValue:11000.000000002045]] \n 31308| [ChunkMetadataList] of root.group_12.d5.s_TEXTe_PLAIN, tsDataType:TEXT\n | [startTime: 1 endTime: 10000 count: 10000 [firstValue:version_test,lastValue:version_test]] \n 32840| [MetadataIndex] of root.group_12.d0\n 32881| [MetadataIndex] of root.group_12.d1\n 32920| [MetadataIndex] of root.group_12.d2\n 32959| [MetadataIndex] of root.group_12.d3\n 33000| [MetadataIndex] of root.group_12.d4\n 33042| [MetadataIndex] of root.group_12.d5\n 33080| [TsFileMetadata]\n | [num of devices] 6\n | 6 key&TsMetadataIndex\n | [totalChunkNum] 17\n | [invalidChunkNum] 0\n | [bloom filter bit vector byte array length] 32\n | [bloom filter bit vector byte array] \n | [bloom filter number of bits] 256\n | [bloom filter number of hash functions] 5\n 33426| [TsFileMetadataSize] 346\n 33430| [magic tail] TsFile\n 33436| END of TsFile\n\n---------------------------------- TsFile Sketch End ----------------------------------\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br"),s("span",{staticClass:"line-number"},[t._v("35")]),s("br"),s("span",{staticClass:"line-number"},[t._v("36")]),s("br"),s("span",{staticClass:"line-number"},[t._v("37")]),s("br"),s("span",{staticClass:"line-number"},[t._v("38")]),s("br"),s("span",{staticClass:"line-number"},[t._v("39")]),s("br"),s("span",{staticClass:"line-number"},[t._v("40")]),s("br"),s("span",{staticClass:"line-number"},[t._v("41")]),s("br"),s("span",{staticClass:"line-number"},[t._v("42")]),s("br"),s("span",{staticClass:"line-number"},[t._v("43")]),s("br"),s("span",{staticClass:"line-number"},[t._v("44")]),s("br"),s("span",{staticClass:"line-number"},[t._v("45")]),s("br"),s("span",{staticClass:"line-number"},[t._v("46")]),s("br"),s("span",{staticClass:"line-number"},[t._v("47")]),s("br"),s("span",{staticClass:"line-number"},[t._v("48")]),s("br"),s("span",{staticClass:"line-number"},[t._v("49")]),s("br"),s("span",{staticClass:"line-number"},[t._v("50")]),s("br"),s("span",{staticClass:"line-number"},[t._v("51")]),s("br"),s("span",{staticClass:"line-number"},[t._v("52")]),s("br"),s("span",{staticClass:"line-number"},[t._v("53")]),s("br"),s("span",{staticClass:"line-number"},[t._v("54")]),s("br"),s("span",{staticClass:"line-number"},[t._v("55")]),s("br"),s("span",{staticClass:"line-number"},[t._v("56")]),s("br"),s("span",{staticClass:"line-number"},[t._v("57")]),s("br"),s("span",{staticClass:"line-number"},[t._v("58")]),s("br"),s("span",{staticClass:"line-number"},[t._v("59")]),s("br"),s("span",{staticClass:"line-number"},[t._v("60")]),s("br"),s("span",{staticClass:"line-number"},[t._v("61")]),s("br"),s("span",{staticClass:"line-number"},[t._v("62")]),s("br"),s("span",{staticClass:"line-number"},[t._v("63")]),s("br"),s("span",{staticClass:"line-number"},[t._v("64")]),s("br"),s("span",{staticClass:"line-number"},[t._v("65")]),s("br"),s("span",{staticClass:"line-number"},[t._v("66")]),s("br"),s("span",{staticClass:"line-number"},[t._v("67")]),s("br"),s("span",{staticClass:"line-number"},[t._v("68")]),s("br"),s("span",{staticClass:"line-number"},[t._v("69")]),s("br"),s("span",{staticClass:"line-number"},[t._v("70")]),s("br"),s("span",{staticClass:"line-number"},[t._v("71")]),s("br"),s("span",{staticClass:"line-number"},[t._v("72")]),s("br"),s("span",{staticClass:"line-number"},[t._v("73")]),s("br"),s("span",{staticClass:"line-number"},[t._v("74")]),s("br"),s("span",{staticClass:"line-number"},[t._v("75")]),s("br"),s("span",{staticClass:"line-number"},[t._v("76")]),s("br"),s("span",{staticClass:"line-number"},[t._v("77")]),s("br"),s("span",{staticClass:"line-number"},[t._v("78")]),s("br"),s("span",{staticClass:"line-number"},[t._v("79")]),s("br"),s("span",{staticClass:"line-number"},[t._v("80")]),s("br"),s("span",{staticClass:"line-number"},[t._v("81")]),s("br"),s("span",{staticClass:"line-number"},[t._v("82")]),s("br"),s("span",{staticClass:"line-number"},[t._v("83")]),s("br"),s("span",{staticClass:"line-number"},[t._v("84")]),s("br"),s("span",{staticClass:"line-number"},[t._v("85")]),s("br"),s("span",{staticClass:"line-number"},[t._v("86")]),s("br"),s("span",{staticClass:"line-number"},[t._v("87")]),s("br"),s("span",{staticClass:"line-number"},[t._v("88")]),s("br"),s("span",{staticClass:"line-number"},[t._v("89")]),s("br"),s("span",{staticClass:"line-number"},[t._v("90")]),s("br"),s("span",{staticClass:"line-number"},[t._v("91")]),s("br"),s("span",{staticClass:"line-number"},[t._v("92")]),s("br"),s("span",{staticClass:"line-number"},[t._v("93")]),s("br"),s("span",{staticClass:"line-number"},[t._v("94")]),s("br"),s("span",{staticClass:"line-number"},[t._v("95")]),s("br"),s("span",{staticClass:"line-number"},[t._v("96")]),s("br"),s("span",{staticClass:"line-number"},[t._v("97")]),s("br"),s("span",{staticClass:"line-number"},[t._v("98")]),s("br"),s("span",{staticClass:"line-number"},[t._v("99")]),s("br"),s("span",{staticClass:"line-number"},[t._v("100")]),s("br"),s("span",{staticClass:"line-number"},[t._v("101")]),s("br"),s("span",{staticClass:"line-number"},[t._v("102")]),s("br"),s("span",{staticClass:"line-number"},[t._v("103")]),s("br"),s("span",{staticClass:"line-number"},[t._v("104")]),s("br"),s("span",{staticClass:"line-number"},[t._v("105")]),s("br"),s("span",{staticClass:"line-number"},[t._v("106")]),s("br"),s("span",{staticClass:"line-number"},[t._v("107")]),s("br"),s("span",{staticClass:"line-number"},[t._v("108")]),s("br"),s("span",{staticClass:"line-number"},[t._v("109")]),s("br"),s("span",{staticClass:"line-number"},[t._v("110")]),s("br"),s("span",{staticClass:"line-number"},[t._v("111")]),s("br"),s("span",{staticClass:"line-number"},[t._v("112")]),s("br"),s("span",{staticClass:"line-number"},[t._v("113")]),s("br"),s("span",{staticClass:"line-number"},[t._v("114")]),s("br"),s("span",{staticClass:"line-number"},[t._v("115")]),s("br"),s("span",{staticClass:"line-number"},[t._v("116")]),s("br"),s("span",{staticClass:"line-number"},[t._v("117")]),s("br"),s("span",{staticClass:"line-number"},[t._v("118")]),s("br"),s("span",{staticClass:"line-number"},[t._v("119")]),s("br"),s("span",{staticClass:"line-number"},[t._v("120")]),s("br"),s("span",{staticClass:"line-number"},[t._v("121")]),s("br"),s("span",{staticClass:"line-number"},[t._v("122")]),s("br"),s("span",{staticClass:"line-number"},[t._v("123")]),s("br"),s("span",{staticClass:"line-number"},[t._v("124")]),s("br"),s("span",{staticClass:"line-number"},[t._v("125")]),s("br"),s("span",{staticClass:"line-number"},[t._v("126")]),s("br"),s("span",{staticClass:"line-number"},[t._v("127")]),s("br"),s("span",{staticClass:"line-number"},[t._v("128")]),s("br"),s("span",{staticClass:"line-number"},[t._v("129")]),s("br"),s("span",{staticClass:"line-number"},[t._v("130")]),s("br"),s("span",{staticClass:"line-number"},[t._v("131")]),s("br"),s("span",{staticClass:"line-number"},[t._v("132")]),s("br"),s("span",{staticClass:"line-number"},[t._v("133")]),s("br"),s("span",{staticClass:"line-number"},[t._v("134")]),s("br"),s("span",{staticClass:"line-number"},[t._v("135")]),s("br"),s("span",{staticClass:"line-number"},[t._v("136")]),s("br"),s("span",{staticClass:"line-number"},[t._v("137")]),s("br"),s("span",{staticClass:"line-number"},[t._v("138")]),s("br"),s("span",{staticClass:"line-number"},[t._v("139")]),s("br"),s("span",{staticClass:"line-number"},[t._v("140")]),s("br"),s("span",{staticClass:"line-number"},[t._v("141")]),s("br"),s("span",{staticClass:"line-number"},[t._v("142")]),s("br"),s("span",{staticClass:"line-number"},[t._v("143")]),s("br"),s("span",{staticClass:"line-number"},[t._v("144")]),s("br"),s("span",{staticClass:"line-number"},[t._v("145")]),s("br"),s("span",{staticClass:"line-number"},[t._v("146")]),s("br"),s("span",{staticClass:"line-number"},[t._v("147")]),s("br"),s("span",{staticClass:"line-number"},[t._v("148")]),s("br"),s("span",{staticClass:"line-number"},[t._v("149")]),s("br"),s("span",{staticClass:"line-number"},[t._v("150")]),s("br"),s("span",{staticClass:"line-number"},[t._v("151")]),s("br"),s("span",{staticClass:"line-number"},[t._v("152")]),s("br"),s("span",{staticClass:"line-number"},[t._v("153")]),s("br"),s("span",{staticClass:"line-number"},[t._v("154")]),s("br"),s("span",{staticClass:"line-number"},[t._v("155")]),s("br"),s("span",{staticClass:"line-number"},[t._v("156")]),s("br"),s("span",{staticClass:"line-number"},[t._v("157")]),s("br"),s("span",{staticClass:"line-number"},[t._v("158")]),s("br"),s("span",{staticClass:"line-number"},[t._v("159")]),s("br"),s("span",{staticClass:"line-number"},[t._v("160")]),s("br"),s("span",{staticClass:"line-number"},[t._v("161")]),s("br"),s("span",{staticClass:"line-number"},[t._v("162")]),s("br"),s("span",{staticClass:"line-number"},[t._v("163")]),s("br"),s("span",{staticClass:"line-number"},[t._v("164")]),s("br"),s("span",{staticClass:"line-number"},[t._v("165")]),s("br"),s("span",{staticClass:"line-number"},[t._v("166")]),s("br"),s("span",{staticClass:"line-number"},[t._v("167")]),s("br"),s("span",{staticClass:"line-number"},[t._v("168")]),s("br"),s("span",{staticClass:"line-number"},[t._v("169")]),s("br"),s("span",{staticClass:"line-number"},[t._v("170")]),s("br"),s("span",{staticClass:"line-number"},[t._v("171")]),s("br"),s("span",{staticClass:"line-number"},[t._v("172")]),s("br"),s("span",{staticClass:"line-number"},[t._v("173")]),s("br"),s("span",{staticClass:"line-number"},[t._v("174")]),s("br"),s("span",{staticClass:"line-number"},[t._v("175")]),s("br"),s("span",{staticClass:"line-number"},[t._v("176")]),s("br"),s("span",{staticClass:"line-number"},[t._v("177")]),s("br"),s("span",{staticClass:"line-number"},[t._v("178")]),s("br"),s("span",{staticClass:"line-number"},[t._v("179")]),s("br"),s("span",{staticClass:"line-number"},[t._v("180")]),s("br"),s("span",{staticClass:"line-number"},[t._v("181")]),s("br"),s("span",{staticClass:"line-number"},[t._v("182")]),s("br"),s("span",{staticClass:"line-number"},[t._v("183")]),s("br"),s("span",{staticClass:"line-number"},[t._v("184")]),s("br"),s("span",{staticClass:"line-number"},[t._v("185")]),s("br"),s("span",{staticClass:"line-number"},[t._v("186")]),s("br"),s("span",{staticClass:"line-number"},[t._v("187")]),s("br"),s("span",{staticClass:"line-number"},[t._v("188")]),s("br"),s("span",{staticClass:"line-number"},[t._v("189")]),s("br"),s("span",{staticClass:"line-number"},[t._v("190")]),s("br"),s("span",{staticClass:"line-number"},[t._v("191")]),s("br"),s("span",{staticClass:"line-number"},[t._v("192")]),s("br"),s("span",{staticClass:"line-number"},[t._v("193")]),s("br"),s("span",{staticClass:"line-number"},[t._v("194")]),s("br"),s("span",{staticClass:"line-number"},[t._v("195")]),s("br"),s("span",{staticClass:"line-number"},[t._v("196")]),s("br"),s("span",{staticClass:"line-number"},[t._v("197")]),s("br"),s("span",{staticClass:"line-number"},[t._v("198")]),s("br"),s("span",{staticClass:"line-number"},[t._v("199")]),s("br"),s("span",{staticClass:"line-number"},[t._v("200")]),s("br"),s("span",{staticClass:"line-number"},[t._v("201")]),s("br"),s("span",{staticClass:"line-number"},[t._v("202")]),s("br"),s("span",{staticClass:"line-number"},[t._v("203")]),s("br"),s("span",{staticClass:"line-number"},[t._v("204")]),s("br"),s("span",{staticClass:"line-number"},[t._v("205")]),s("br"),s("span",{staticClass:"line-number"},[t._v("206")]),s("br"),s("span",{staticClass:"line-number"},[t._v("207")]),s("br"),s("span",{staticClass:"line-number"},[t._v("208")]),s("br"),s("span",{staticClass:"line-number"},[t._v("209")]),s("br"),s("span",{staticClass:"line-number"},[t._v("210")]),s("br"),s("span",{staticClass:"line-number"},[t._v("211")]),s("br"),s("span",{staticClass:"line-number"},[t._v("212")]),s("br"),s("span",{staticClass:"line-number"},[t._v("213")]),s("br"),s("span",{staticClass:"line-number"},[t._v("214")]),s("br")])]),s("h3",{attrs:{id:"_3-4-tsfilesequenceread"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_3-4-tsfilesequenceread"}},[t._v("#")]),t._v(" 3.4 TsFileSequenceRead")]),t._v(" "),s("p",[t._v("您可以使用示例中的类 "),s("code",[t._v("example/tsfile/org/apache/iotdb/tsfile/TsFileSequenceRead")]),t._v(" 顺序打印 TsFile 中的内容.")]),t._v(" "),s("h3",{attrs:{id:"_3-5-vis-tool"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_3-5-vis-tool"}},[t._v("#")]),t._v(" 3.5 Vis Tool")]),t._v(" "),s("p",[t._v("Vis是一个把TsFiles中的chunk数据的时间分布以及点数可视化的工具。你可以使用这个工具来帮助你debug,还可以用来观察数据分布等等。\n欢迎使用这个工具,在社区里交流你的想法。")]),t._v(" "),s("p",[s("img",{attrs:{src:"https://user-images.githubusercontent.com/33376433/123763559-82074100-d8f6-11eb-9109-ead7e18f84b8.png",alt:"image"}})]),t._v(" "),s("ul",[s("li",[t._v("图中的一个窄长矩形代表的是一个TsFile里的一个chunk,其可视化信息为[tsName, fileName, chunkId, startTime, endTime, pointCountNum]。")]),t._v(" "),s("li",[t._v("矩形在x轴上的位置是由该chunk的startTime和endTime决定的。")]),t._v(" "),s("li",[t._v("矩形在y轴上的位置是由以下三项共同决定的:\n"),s("ul",[s("li",[t._v("(a)"),s("code",[t._v("showSpecific")]),t._v(": 用户指定要显示的特定时间序列集合。")]),t._v(" "),s("li",[t._v("(b) seqKey/unseqKey显示规则: 从满足特定时间序列集合的keys提取seqKey或unseqKey时采取不同的显示规则:\n"),s("ul",[s("li",[t._v("b-1) unseqKey识别tsName和fileName,因此有相同tsName和fileName但是不同chunkIds的chunk数据将绘制在同一行;")]),t._v(" "),s("li",[t._v("b-2) seqKey识别tsName,因此有相同tsName但是不同fileNames和chunkIds的chunk数据将绘制在同一行,")])])]),t._v(" "),s("li",[t._v("(c)"),s("code",[t._v("isFileOrder")]),t._v(":根据"),s("code",[t._v("isFileOrder")]),t._v("对seqKey&unseqKey进行排序,true则以fileName优先的顺序排序,\nfalse则以tsName优先的顺序排序。当在一张图上同时显示多条时间序列时,该参数将给用户提供这两种可选的观察视角。")])])])]),t._v(" "),s("h4",{attrs:{id:"_3-5-1-如何运行vis"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_3-5-1-如何运行vis"}},[t._v("#")]),t._v(" 3.5.1 如何运行Vis")]),t._v(" "),s("p",[t._v("源数据包含两个文件:"),s("code",[t._v("TsFileExtractVisdata.java")]),t._v("和"),s("code",[t._v("vis.m")]),t._v("。\n"),s("code",[t._v("TsFileExtractVisdata.java")]),t._v("从输入的tsfile文件中提取必要的可视化信息,"),s("code",[t._v("vis.m")]),t._v("用这些信息来完成作图。")]),t._v(" "),s("p",[t._v("简单说就是:先运行"),s("code",[t._v("TsFileExtractVisdata.java")]),t._v("然后再运行"),s("code",[t._v("vis.m")]),t._v("。")]),t._v(" "),s("h5",{attrs:{id:"第一步-运行tsfileextractvisdata-java"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#第一步-运行tsfileextractvisdata-java"}},[t._v("#")]),t._v(" 第一步:运行TsFileExtractVisdata.java")]),t._v(" "),s("p",[s("code",[t._v("TsFileExtractVisdata.java")]),t._v("对输入的tsfiles的每一个chunk提取可视化信息[tsName, fileName, chunkId, startTime, endTime, pointCountNum],\n并把这些信息保存到指定的输出文件里。")]),t._v(" "),s("p",[t._v("该工具的启动脚本会在编译 server 之后生成至 "),s("code",[t._v("server\\target\\iotdb-server-{version}\\tools\\tsfileToolSet")]),t._v(" 目录中。")]),t._v(" "),s("p",[t._v("使用方式:")]),t._v(" "),s("p",[t._v("Windows:")]),t._v(" "),s("div",{staticClass:"language- line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v(".\\print-tsfile-visdata.bat path1 seqIndicator1 path2 seqIndicator2 ... pathN seqIndicatorN outputPath\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br")])]),s("p",[t._v("Linux or MacOs:")]),t._v(" "),s("div",{staticClass:"language- line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("./print-tsfile-visdata.sh path1 seqIndicator1 path2 seqIndicator2 ... pathN seqIndicatorN outputPath\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br")])]),s("p",[t._v("参数: ["),s("code",[t._v("path1")]),t._v(" "),s("code",[t._v("seqIndicator1")]),t._v(" "),s("code",[t._v("path2")]),t._v(" "),s("code",[t._v("seqIndicator2")]),t._v(" ... "),s("code",[t._v("pathN")]),t._v(" "),s("code",[t._v("seqIndicatorN")]),t._v(" "),s("code",[t._v("outputPath")]),t._v("]")]),t._v(" "),s("p",[t._v("细节:")]),t._v(" "),s("ul",[s("li",[t._v("一共2N+1个参数。")]),t._v(" "),s("li",[s("code",[t._v("seqIndicator")]),t._v(":'true'或者'false' (大小写不敏感). 'true'表示是顺序文件, 'false'表示是乱序文件。")]),t._v(" "),s("li",[s("code",[t._v("Path")]),t._v(":可以是一个tsfile的全路径,也可以是一个文件夹路径。如果是文件夹路径,你需要确保这个文件夹下的所有tsfile文件的"),s("code",[t._v("seqIndicator")]),t._v("都是一样的。")]),t._v(" "),s("li",[t._v("输入的所有TsFile文件必须是封好口的。处理未封口的文件留待未来有需要的情况再实现。")])]),t._v(" "),s("h5",{attrs:{id:"第二步-运行vis-m"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#第二步-运行vis-m"}},[t._v("#")]),t._v(" 第二步:运行vis.m")]),t._v(" "),s("p",[s("code",[t._v("vis.m")]),t._v("把"),s("code",[t._v("TsFileExtractVisdata")]),t._v("生成的visdata加载进来,然后基于visdata以及两个用户绘图参数"),s("code",[t._v("showSpecific")]),t._v("和"),s("code",[t._v("isFileOrder")]),t._v("来完成作图。")]),t._v(" "),s("div",{staticClass:"language-matlab line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-matlab"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("timeMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("countMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("loadVisData")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("filePath"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("timestampUnit"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% Load visdata generated by TsFileExtractVisdata.")]),t._v("\n%\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% filePath: the path of visdata.")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% The format is [tsName,fileName,chunkId,startTime,endTime,pointCountNum].")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% `tsName` and `fileName` are string, the others are long value.")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('% If the tsfile is unsequence file, `fileName` will contain "unseq" as an')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% indicator, which is guaranteed by TsFileExtractVisdata.")]),t._v("\n%\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% timestampUnit(not case sensitive):")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% 'us' if the timestamp is microsecond, e.g., 1621993620816000")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% 'ms' if it is millisecond, e.g., 1621993620816")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% 's' if it is second, e.g., 1621993620")]),t._v("\n%\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% timeMap: record the time range of every chunk.")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% Key [tsName][fileName][chunkId] identifies the only chunk. Value is")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% [startTime,endTime] of the chunk.")]),t._v("\n%\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% countMap: record the point count number of every chunk. Key is the same")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% as that of timeMap. Value is pointCountNum.")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br")])]),s("div",{staticClass:"language-matlab line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-matlab"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("draw")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("timeMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("countMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("showSpecific"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("isFileOrder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% Plot figures given the loaded data and two plot parameters:")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% `showSpecific` and `isFileOrder`.")]),t._v("\n%\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% process: 1) traverse `keys(timeMap)` to get the position arrangements on")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% the y axis dynamically, which is defined simultaneously by")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% (a)`showSpecific`: traverse `keys(timeMap)`, filter out keys")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% that don't statisfy `showSpecific`.")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% (b) seqKey/unseqKey display policies: extract seqKey or unseqKey")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% from statisfied keys under different display policies:")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% b-1) unseqKey identifies tsName and fileName, so chunk data with the")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% same fileName and tsName but different chunkIds are")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% plotted on the same line.")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% b-2) seqKey identifies tsName, so chunk data with the same tsName but")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% different fileNames and chunkIds are plotted on the same")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% line.")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% (c)`isFileOrder`: sort seqKey&unseqKey according to `isFileOrder`,")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% finally get the position arrangements on the y axis.")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% 2) traverse `keys(timeMap)` again, get startTime&endTime from")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% `treeMap` as positions on the x axis, combined with the")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% positions on the y axis from the last step, finish plot.")]),t._v("\n%\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% timeMap,countMap: generated by loadVisData function.")]),t._v("\n%\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% showSpecific: the specific set of time series to be plotted.")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% If showSpecific is empty{}, then all loaded time series")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% will be plotted.")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% Note: Wildcard matching is not supported now. In other")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% words, showSpecific only support full time series path")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% names.")]),t._v("\n%\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% isFileOrder: true to sort seqKeys&unseqKeys by fileName priority, false")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% to sort seqKeys&unseqKeys by tsName priority.")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br")])]),s("h4",{attrs:{id:"_3-5-2-例子"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_3-5-2-例子"}},[t._v("#")]),t._v(" 3.5.2 例子")]),t._v(" "),s("h5",{attrs:{id:"例1"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#例1"}},[t._v("#")]),t._v(" 例1")]),t._v(" "),s("p",[t._v("使用由"),s("code",[t._v("IoTDBLargeDataIT.insertData")]),t._v("写出的tsfiles。\n小修改:"),s("code",[t._v("IoTDBLargeDataIT.insertData")]),t._v("最后添加一条"),s("code",[t._v('statement.execute("flush");')]),t._v("指令。")]),t._v(" "),s("p",[t._v("第一步:运行"),s("code",[t._v("TsFileExtractVisdata.java")])]),t._v(" "),s("div",{staticClass:"language- line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v(".\\print-tsfile-visdata.bat data\\sequence true data\\unsequence false D:\\visdata1.csv\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br")])]),s("p",[t._v("或者等价地:")]),t._v(" "),s("div",{staticClass:"language- line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v(".\\print-tsfile-visdata.bat data\\sequence\\root.vehicle\\0\\0\\1622743492580-1-0.tsfile true data\\sequence\\root.vehicle\\0\\0\\1622743505092-2-0.tsfile true data\\sequence\\root.vehicle\\0\\0\\1622743505573-3-0.tsfile true data\\unsequence\\root.vehicle\\0\\0\\1622743505901-4-0.tsfile false D:\\visdata1.csv\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br")])]),s("p",[t._v("第二步:运行"),s("code",[t._v("vis.m")])]),t._v(" "),s("div",{staticClass:"language-matlab line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-matlab"}},[s("code",[t._v("clear all"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("close all"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% 1. load visdata generated by TsFileExtractVisdata")]),t._v("\nfilePath "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'D:\\visdata1.csv'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("timeMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("countMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("loadVisData")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("filePath"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'ms'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% mind the timestamp unit")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% 2. plot figures given the loaded data and two plot parameters:")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("% `showSpecific` and `isFileOrder`")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("draw")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("timeMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("countMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("false"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("title")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v('"'),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("draw")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("timeMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("countMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("\\")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("\\")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("false"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v('"'),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("draw")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("timeMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("countMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("true"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("title")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v('"'),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("draw")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("timeMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("countMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("\\")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("\\")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("true"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v('"'),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("draw")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("timeMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("countMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'root.vehicle.d0.s0'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("false"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("title")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v('"'),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("draw")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("timeMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("countMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'root.vehicle.d0.s0'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("false"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v('"'),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("draw")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("timeMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("countMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'root.vehicle.d0.s0'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'root.vehicle.d0.s1'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("false"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("title")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v('"'),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("draw")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("timeMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("countMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'root.vehicle.d0.s0'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'root.vehicle.d0.s1'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("false"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v('"'),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("draw")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("timeMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("countMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'root.vehicle.d0.s0'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'root.vehicle.d0.s1'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("true"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("title")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v('"'),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("draw")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("timeMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("countMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'root.vehicle.d0.s0'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'root.vehicle.d0.s1'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("true"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v('"'),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br")])]),s("p",[t._v("绘图结果:")]),t._v(" "),s("p",[s("img",{attrs:{src:"https://user-images.githubusercontent.com/33376433/123760377-5df63080-d8f3-11eb-8ca8-c93590f21bde.png",alt:"1"}}),t._v(" "),s("img",{attrs:{src:"https://user-images.githubusercontent.com/33376433/123760402-63537b00-d8f3-11eb-9393-398c4204ccf1.png",alt:"2"}}),t._v(" "),s("img",{attrs:{src:"https://user-images.githubusercontent.com/33376433/123760418-66e70200-d8f3-11eb-8701-437afd73ac4c.png",alt:"3"}}),t._v(" "),s("img",{attrs:{src:"https://user-images.githubusercontent.com/33376433/123760424-69e1f280-d8f3-11eb-9f45-571496685a6e.png",alt:"4"}}),t._v(" "),s("img",{attrs:{src:"https://user-images.githubusercontent.com/33376433/123760433-6cdce300-d8f3-11eb-8ecd-da04a475af41.png",alt:"5"}})])])}),[],!1,null,null,null);e.default=n.exports}}]);