首页 > 编程语言 >Apache IoTDB C# SDK 介绍

Apache IoTDB C# SDK 介绍

时间:2023-01-28 17:39:01浏览次数:60  
标签:C# SessionPool test IoTDB Apache pool 客户端

  • 最近今天写了IoTDB的三篇相关文章,完成了安装部署和客户端连接:


  • ​​Windows Server上部署IoTDB 集群​​
  • ​​DBeaver 连接IoTDBDriver​​
  • ​​将IoTDB注册为Windows服务​​

TsFile 是 IoTDB 的底层数据文件,一种专门为时间序列数据设计的列式文件格式。IoTDB TsFile数据读写主要是下面两个结构:

  • IoTDB 提供了一个TSRecord工具,TSRecord记录了一个设备在一个时间戳下的若干测点信息。在c# 客户端里被抽象成了Row Record
  • IoTDB 提供了一个Tablet工具,Tablet记录了一个设备的多个测点的信息,按照一种表格的形式表示,这些测点具有相同的时间戳序列,因此可以应用在测点具有相同时间戳序列(每个时间戳下各个测点都具有值)的设备中。

IoTDB C# SDK  叫做 Apache-IoTDB-Client-CSharp,Github:​​https://github.com/eedalong/Apache-IoTDB-Client-CSharp​​ ,Nuget 包有两个:

Apache.IoTDB和 Apache.IoTDB.Data。 其中 Apache.IoTDB.Data 是对ADO .NET支持,以.NET 读取数据库的方式方便不同使用习惯的用户, C#客户端也及时更新支持最新的Apache IoTDB的特性,如对齐序列插入、SchemaTemplate操纵接口的 支持、支持插入空值的Tablet结构等。

最近刚刚发布了对IoTDB 1.0版本的支持的1.0.0.1预览版已经发布,欢迎各位试用并提issue~: ​​https://www.nuget.org/packages/Apache.IoTDB/1.0.0.1-alpha​


使用示例


// 参数定义

string host = "localhost";

int port = 6667;

int pool_size = 2;// 初始化session

var session_pool = new SessionPool(host, port, pool_size);// 开启session

await session_pool.Open(false);// 创建时间序列

await session_pool.CreateTimeSeries("root.test_group.test_device.ts1", TSDataType.TEXT, TSEncoding.PLAIN, Compressor.UNCOMPRESSED);

await session_pool.CreateTimeSeries("root.test_group.test_device.ts2", TSDataType.BOOLEAN, TSEncoding.PLAIN, Compressor.UNCOMPRESSED);

await session_pool.CreateTimeSeries("root.test_group.test_device.ts3", TSDataType.INT32, TSEncoding.PLAIN, Compressor.UNCOMPRESSED);// 插入record

var measures = new List<string>{"ts1", "ts2", "ts3"};

var values = new List<object> { "test_text", true, (int)123 };

var timestamp = 1;

var rowRecord = new RowRecord(timestamp, values, measures);

await session_pool.InsertRecordAsync("root.test_group.test_device", rowRecord);// 插入Tablet

var timestamp_lst = new List<long>{ timestamp + 1 };

var value_lst = new List<object> {new() {"iotdb", true, (int) 12}};

var tablet = new Tablet("root.test_group.test_device", measures, value_lst, timestamp_ls);

await session_pool.InsertTabletAsync(tablet);// 关闭Session

await session_pool.Close();

详细接口信息可以参考接口文档

连接池

C#客户端暴露的所有接口均为异步接口。使用C#客户端从首先建立一个SessionPool开始,建立SessionPool时需要指定服务器的IP 、Port 以及 SessionPool的大小,SessionPool的大小代表本地与服务器建立的连接的数目。为了实现并发客户端请求,客户端提供了针对原生接口的连接池(​​SessionPool​​​),由于​​SessionPool​​​本身为​​Session​​​的超集,当​​SessionPool​​​的​​pool_size​​​参数设置为1时,退化为原来的​​Session​

客户端 使用​​ConcurrentQueue​​​数据结构封装了一个客户端队列,以维护与服务端的多个连接,当调用​​Open()​​​接口时,会在该队列中创建指定个数的客户端,同时通过​​System.Threading.Monitor​​类实现对队列的同步访问。

当请求发生时,会尝试从连接池中寻找一个空闲的客户端连接,如果没有空闲连接,那么程序将需要等待直到有空闲连接

当一个连接被用完后,他会自动返回池中等待下次被使用

在使用连接池后,客户端的并发性能提升明显,​​这篇文档​​展示了使用线程池比起单线程所带来的性能提升

ByteBuffer

在传入RPC接口参数时,需要对Record和Tablet两种数据结构进行序列化,我们主要通过封装的ByteBuffer类实现

在封装字节序列的基础上,我们进行了内存预申请与内存倍增的优化,减少了序列化过程中内存的申请和释放,在一个拥有20000行的Tablet上进行序列化测试时,速度比起原生的数组动态增长具有35倍的性能加速,详见以下两篇文档:

在库里 有一个 IoTDB C#客⼾端性能分析报告:​​https://github.com/eedalong/Apache-IoTDB-Client-CSharp/blob/main/docs/time_profile_zh.pdf​​ ,建议大家看一看,这里只说结论:

  • 在插⼊与该⽤⼾类似的结构化较强、没有空值、规整、每⾏的column固定的的数据时,建议使⽤insert_tablet接⼝,经过改善后的insert_tablet接⼝具备较好的性能,能满⾜该⽤⼾的需求
  • 数据量较⼤,但数据整体不规整或者有空值,每⾏数据的column数不定时建议使⽤insert_records接⼝,该接⼝对record数据的插⼊速度较为可观
  • 数据量⼩,需要对原有数据做出⼀定的修正 时,使⽤insert_record接⼝

 

参考文章:



标签:C#,SessionPool,test,IoTDB,Apache,pool,客户端
From: https://blog.51cto.com/shanyou/6025029

相关文章

  • unknow or unsupported command install
    错误原因:今天使用pip下载labelimg时,出现了“unknoworunsupportedcommandinstall”的错误,这是由于电脑有多个pip文件路径所导致。如图,在cmd命令行中输入“wherepip”命......
  • cpufreq之ACPI CPPC
    Overview参见ACPISPEC章节:8.4.7CollaborativeProcessorPerformanceControlCPPC(CollaborativeProcessorPerformanceControl)是ACPI规范中定义的一套机制,让O......
  • BUUCTF 神秘龙卷风
    神秘龙卷风转转转,科学家用四位数字为它命名,但是发现解密后居然是一串外星人代码!!好可怕!注意:得到的flag请包上flag{}提交打开压缩包发现先是破密,然后得到密码:  ......
  • leetcode_数据结构_入门_118. 杨辉三角
    118.杨辉三角给定一个非负整数numRows,生成「杨辉三角」的前numRows行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。方法一:数学思路及解法......
  • C# 序列化Json时如何忽略JsonProperty(PropertyName =“ someName”)
    前言序列化大家都很常见,就是把一个对象序列化成一串Json字符串。最近对接第三方的时候遇到了一个情况,我们C#都是用骆驼命名,而他们呢需要接收的Json字符串的 key 是 ......
  • JavaScript写一个连连看的游戏
    天天看到别人玩连连看,表示没有认真玩过,不就把两个一样的图片连接在一起么,我自己写一个都可以呢。使用Javascript写了一个,托管到github,在线DEMO地址查看:​​打......
  • vscode配置存档
    //setting.json{"debug.console.fontFamily":"JetBrainsMono",//控制在运行预启动任务后遇到错误时应该怎么做。debugAnyway:忽略任务错误并开始调试。"de......
  • ESXi 安装 Truenas Core 解决企业共享存储免费方案
    服务器配置创建虚拟机内存最少8+,建议选择32,CPU没啥用,我给了2,硬盘我选择了50G+8T,因为一个虚拟机无法使用两个存储池,所以全部使用非SSD硬盘,自带网卡删除,单独给一个直通网卡,......
  • TypeScript 常用语法实例 & 实用工具类型
    1.函数上声明返回值类型constuserInfoJson=require('./mock/user-info.json')interfaceResponse<T>{data:{module:T;resultCode?:any;}......
  • LTC2440串行SPI通讯时序
    LTC2440简介我们使用4-wireSPI接口按照时序图上的描述,SDO是在SCLK的下降沿更新数据,那么FPGA接收端就应该在上升沿采集数据。实际测试发现SDO数据相对于SCLK延迟了6......