DolphinDB插件开发深度解析

本页为一篇关于 DolphinDB 插件开发的文章页面,包含标题、作者署名与发布时间信息。

Source: https://dolphindb.cn/blogs/81

What this page covers

技能认证特训营第二期报名信息

页面顶部提供活动报名入口与限时报名链接信息。

DolphinDB插件开发深度解析(标题、作者与日期)

该部分展示文章标题、作者署名与发布时间信息。

插件概述与参考资料

说明 DolphinDB 支持 C++ 插件动态加载、插件编译形式及参考主页/教程链接。

本文关注的问题与目录

该部分列出本文将解析的常见问题主题与小节目录。

创建对象:Constant/ConstantSP与派生类型

介绍插件中用 Constant 表示数据对象、使用 ConstantSP 智能指针管理生命周期及常见派生类型。

创建标量(Scalar)

说明在插件中创建标量的两种方式(new 标量实现类 vs Util::createConstant+set)并给出示例。

创建非标量对象(概述)

指出 Util.h 提供一系列函数用于快速创建非标量对象。

创建Vector

介绍 createVector/createRepeatingVector/createIndexVector 的用途与示例,包括元组(any vector)操作注意事项。

创建Matrix

介绍 createMatrix 与 createDoubleMatrix 的参数与示例。

创建Set

介绍 createSet 所需参数(含 SymbolBaseSP)及示例,说明 symbol 内部存储与映射关系。

创建Dictionary

介绍 createDictionary 所需参数(key/value 类型与 SymbolBaseSP)以及 set 方式示例。

创建Table

介绍 createTable 的两种创建方式(列名+列类型 vs 列名+列向量)并给出示例。

创建PartialFunction(部分应用)与插件加载调用示例

说明如何用 createSystemFunction 与 createPartialFunction 固定部分参数生成新函数,并展示插件描述文件、加载与调用示例及内置函数固定参数场景。

高效读写Vector和内存表中的数据(概述)

说明插件读写 Vector 与内存表需要正确使用接口以避免效率问题。

Vector高效读取:实现差异与访问原则

解释 Vector 可能为 regular vector 或 big array 等实现方式,除非明确 FastVector 模式否则不应直接使用数据指针操作。

Vector读取接口:getInt 单点/批量/只读缓冲区

给出 getInt(index)、getInt(start,len,buf)、getIntConst(start,len,buf) 三种读取方法与性能建议。

String/Symbol Vector高效读取

分别说明 String 向量可用 getDataArray 并转为 DolphinString 访问,Symbol 向量需配合 SymbolBaseSP 映射字符串。

Vector更新接口:setInt/setData/getIntBuffer+setInt与建议

列出多种更新方式并给出不推荐与推荐的性能原因(减少虚函数调用与内存拷贝)。

Facts Index

Entity Attribute Value Confidence
技能认证特训营第二期报名链接https://www.qingsuyun.com/h5/e/217471/5/high
DolphinDB插件开发深度解析发布日期2021-08-05high
DolphinDB支持能力支持动态加载外部插件以扩展系统功能high
DolphinDB插件开发语言C++high
DolphinDB插件编译产物需要编译成“.so”或“.dll”共享库文件high
DolphinDB Plugin主页参考链接https://github.com/dolphindb/DolphinDBPlugin (原文为link.zhihu.com跳转)high
DolphinDB插件开发教程参考链接https://zhuanlan.zhihu.com/p/59850354high
ConstantSP内存管理机制封装的智能指针;引用计数为0时自动释放内存,不需要用户手动释放high
Constant类型表示对象范围可表示标量、向量、矩阵、表等大部分数据对象high
ConstantSP派生类型示例VectorSP(向量)、TableSP(表)等high
插件中创建标量方法一使用new创建ScalarImp.h中声明的标量实现类对象并赋值给ConstantSPhigh
插件中创建标量方法二(推荐性)可用Util::createConstant创建标量并用set方法赋值;该方法“比较麻烦,不推荐使用”medium
Date类型标量赋值原因与方式日期在DolphinDB中存储为int(自1970.01.01起的天数);由于日期类型没有对应set方法,可换算后用setInt赋值(示例18577表示2020.11.11)high
Void类型Constant用途可创建Void变量,常用于表示空的函数参数high
非标量对象创建工具函数位置Util.h中声明一系列函数用于快速创建某类型的非标量对象high
Util::createVector用途创建指定类型与长度的Vectorhigh
Util::createRepeatingVector用途创建所有元素相同的Vector,需要传入ConstantSP和值长度high
Util::createIndexVector用途创建连续数字序列Vector,需要起始值和长度high
any类型Vector(元组)写入限制不能用setInt(0,4)等类型专用方法直接写入元组;需对get(0)返回对象再setInt等high
Util::createMatrix参数要求需要传入数据类型、列数、行数、列容量high
Util::createDoubleMatrix用途与参数创建double类型Matrix,需要列数与行数high
Util::createSet参数要求需要传入数据类型、SymbolBaseSP和长度high
symbol类型内部表示存储方式symbol在系统内部存储为整数,通过SymbolBaseSP映射到对应字符;不使用可设为nullptrhigh
Util::createDictionary参数要求需要传入key数据类型、key的SymbolBaseSP、value数据类型、value的SymbolBaseSP;创建后可调用set设置key/valuehigh
Util::createTable创建方式常用两种:1) 列名vector+列类型+行数+行容量;2) 列名vector+列向量vectorhigh
Util::createPartialFunction用途用于固定函数的部分参数,生成参数更少的新函数(部分应用)high
PartialFunction实现步骤(示例)步骤先用Util::createSystemFunction创建系统函数temFunc(传入myFunc1及参数个数),再用Util::createPartialFunction传入temFunc与需固定的参数high
插件描述文件命名与内容示例命名为PluginTest.txt;内容示例包含:test,libPluginTest.so 以及myFunc1/myFunc2导出定义行high
DolphinDB加载插件函数loadPlugin("Path_to_PluginTest.txt/PluginTest.txt")high
示例函数myFunc1示例调用结果test::myFunc1(10,5) 返回值示例为35high
示例PartialFunction myFunc2示例调用结果newFunc=test::myFunc2(); newFunc(5) 返回值示例为35(固定第一个参数为10)high
PartialFunction常见场景调用DolphinDB内置函数时固定部分参数(例:将append!(obj,newData)固定table参数以变为一元函数)high
Vector数据访问原则限制条件除非明确知道Vector为FastVector模式(isFastMode=true),否则不能直接使用数据指针对数据操作high
Util::createVector创建的Vector实现regular vector保证条件当元素个数不超过1048576(2^20)时,返回的必定是连续存储的常规数组(regular vector)high
big array分段大小数据分段存储,每段元素个数为1048576(2^20)high
Vector读取接口单点读取方法int getInt(int index) 可通过下标获取元素high
Vector读取接口批量读取方法bool getInt(int start,int len,int* buf) 可批量复制数据到bufferhigh
Vector读取接口只读缓冲区方法const int* getIntConst(int start,int len,int* buf) 当区间内存连续时不拷贝,直接返回内存地址以提升读取效率high
Vector读取性能建议推荐方法数据量大时推荐后两种批量读取(getInt批量、getIntConst),因为逐元素getInt会频繁调用虚函数开销大;批量方式cache命中率高、虚函数调用少medium
String/Symbol类型Vector读取问题用getString(index)逐个读取每次调用虚函数,效率低,需要区别于其他类型的高效读取方式high
String类型Vector高效读取方法String数组内存连续;可用getDataArray获得指针并转为DolphinString后读取high
Symbol类型Vector高效读取方法先按int批量读取symbol整数值,再用SymbolBaseSP映射为字符串输出high
Vector更新接口单点更新方法void setInt(int index,int val) 可更新单个数据点high
Vector更新接口批量更新方法(类型检查)bool setInt(INDEX start,int len,const int* buf) 可批量更新连续数据点high
Vector更新接口 setData行为bool setData(INDEX start,int len,void* buf) 批量更新但不检查数据类型high
Vector更新优化模式方法先用getIntBuffer(start,len,buf)获取buffer,修改后再用setInt批量更新high
Vector更新性能建议不推荐/推荐setInt(index,val)效率最低(反复调用虚函数);setData不检查类型也不推荐;推荐setInt(start,len,buf)批量更新;getIntBuffer后再setInt可减少拷贝从而提高效率medium
getIntBuffer拷贝条件一般直接返回内部地址;仅当区间[start,start+len)跨越vector内存交界处时才拷贝到用户bufferhigh
setInt(start,len,buf)拷贝条件会判断传入buffer地址是否为内部存储地址;若是则直接返回,否则进行内存拷贝high