...
本章是关于 TsFile 的设计细节。
1.1 变量的存储
可变长的字符串类型
存储的方式是以一个
int
类型的Size
+ 字符串组成。Size
的值可以为 0。Size
指的是字符串所占的字节数,它并不一定等于字符串的长度。举例来说,"sensor_1" 这个字符串将被存储为
00 00 00 08
+ "sensor_1" (ASCII编码)。另外需要注意的一点是文件签名 "TsFile000001" (
Magic String
+Version
), 因为他的Size(12)
和 ASCII 编码值是固定的,所以没有必要在这个字符串前的写入Size
值。
数据类型
0: BOOLEAN
1: INT32 (
int
)2: INT64 (
long
)3: FLOAT
4: DOUBLE
5: TEXT (
String
)
编码类型
为了提高数据的存储效率,需要在数据写入的过程中对数据进行编码,从而减少磁盘空间的使用量。在写数据以及读数据的过程中都能够减少I/O操作的数据量从而提高性能。IoTDB支持多种针对不同类型的数据的编码方法:0: PLAIN
PLAIN编码,默认的编码方式,即不编码,支持多种数据类型,压缩和解压缩的时间效率较高,但空间存储效率较低。
1: DICTIONARY
- 字典编码是一种无损编码。它适合编码基数小的数据(即数据去重后唯一值数量小)。不推荐用于基数大的数据。
2: RLE
游程编码,比较适合存储某些整数值连续出现的序列,不适合编码大部分情况下前后值不一样的序列数据。
游程编码也可用于对浮点数进行编码,但在创建时间序列的时候需指定保留小数位数(MAX_POINT_NUMBER,具体指定方式参见本文SQL 参考文档)。比较适合存储某些浮点数值连续出现的序列数据,不适合存储对小数点后精度要求较高以及前后波动较大的序列数据。
游程编码(RLE)和二阶差分编码(TS_2DIFF)对 float 和 double 的编码是有精度限制的,默认保留2位小数。推荐使用 GORILLA。
3: DIFF
4: TS_2DIFF
- 二阶差分编码,比较适合编码单调递增或者递减的序列数据,不适合编码波动较大的数据。
5: BITMAP
6: GORILLA_V1
GORILLA编码是一种无损编码,它比较适合编码前后值比较接近的数值序列,不适合编码前后波动较大的数据。
当前系统中存在两个版本的GORILLA编码实现,推荐使用
GORILLA
,不推荐使用GORILLA_V1
(已过时)。使用限制:使用Gorilla编码INT32数据时,需要保证序列中不存在值为
Integer.MIN_VALUE
的数据点;使用Gorilla编码INT64数据时,需要保证序列中不存在值为Long.MIN_VALUE
的数据点。
7: REGULAR
8: GORILLA
大端存储
比如:int
0x8
将会被存储为 00 00 00 08
, 而不是 08 00 00 00
...
clear all;close all;
% 1. load visdata generated by TsFileExtractVisdata
filePath = 'D:\visdata1.csv';
[timeMap,countMap] = loadVisData(filePath,'ms'); % mind the timestamp unit
% 2. plot figures given the loaded data and two plot parameters:
% `showSpecific` and `isFileOrder`
draw(timeMap,countMap,{},false)
title("draw(timeMap,countMap,\{\},false)")
draw(timeMap,countMap,{},true)
title("draw(timeMap,countMap,\{\},true)")
draw(timeMap,countMap,{'root.vehicle.d0.s0'},false)
title("draw(timeMap,countMap,{'root.vehicle.d0.s0'},false)")
draw(timeMap,countMap,{'root.vehicle.d0.s0','root.vehicle.d0.s1'},false)
title("draw(timeMap,countMap,{'root.vehicle.d0.s0','root.vehicle.d0.s1'},false)")
draw(timeMap,countMap,{'root.vehicle.d0.s0','root.vehicle.d0.s1'},true)
title("draw(timeMap,countMap,{'root.vehicle.d0.s0','root.vehicle.d0.s1'},true)")
绘图结果: