首页 文章 精选 留言 我的

精选列表

搜索[数据库连接池],共10000篇文章
优秀的个人博客,低调大师

干货丨时序数据库DolphinDB代码模块复用教程

在软件团队开发项目中,要提升开发效率和质量,代码必然要进行封装和重用。在使用DolphinDB的脚本进行开发时,可以使用module和use方法,来声明和使用可重用模块。 1. 模块介绍 在DolphinDB中,模块是指只包含函数定义的代码包。它具有以下特点: 以.dos作为模块文件的后缀,dos是DolphinDB script的缩写 模块文件保存在DolphinDB节点的[home]/modules目录下 模块文件第一行以声明模块语句module moduleName开头 模块文件内容仅包含函数定义 2. 定义模块 2.1 创建模块目录 默认情况下,所有的模块定义在[home]/modules目录下,[home]由系统配置参数home决定,可以通过getHomeDir()函数获取。比如DolphinDB节点的home目录为/root/DolphinDB/server,那么我们需要在该目录下创建modules子目录来保存模块文件,最终模块目录为/home/root/DolphinDB/server/modules。 2.2 创建模块文件 在modules目录下创建以.dos为后缀的模块文件,比如FileLog.dos。模块文件的第一行必须是模块声明语句。模块声明语句的语法如下: module moduleName moduleName必须与模块文件的名称一致,比如在FileLog.dos中声明模块: module FileLog 声明模块后,我们可以开始编写模块代码。例如,FileLog.dos的内容如下: module FileLog //向指定日志文件写入日志 def appendLog(filePath, logText){ f = file(filePath,"a+") f.writeLine(string(now()) + " : " + logText) f.close() } 在模块文件中,仅允许封装函数定义,其他非函数定义的代码将被忽略。 3. 导入模块 在DolphinDB中,使用use关键字来导入一个模块。注意,use关键字导入的模块是会话隔离的,仅对当前会话有效。导入模块后,我们可以通过以下两种方式来使用模块内的自定义函数: (1)直接使用模块中的函数: use FileLog appendLog("mylog.txt", "test my log") (2)通过完整路径来调用模块中的函数: use FileLog FileLog::appendLog("mylog.txt", "test my log") 4. 规划模块 DolphinDB database引入了命名空间的概念,支持对模块进行分类和规划。 4.1 声明模块命名空间 如果我们需要对模块进行分类,可以通过多级路径为规划模块的命名空间。例如,现有两个模块FileLog和DateUtil,它们的存放路径分别为modules/system/log/FileLog.dos和modules/system/temperal/DateUtil.dos,那么这两个模块相应的声明语句如下: modules/system/log/FileLog.dos module system::log::FileLog modules/system/temperal/DateUtil.dos module system::temperal::DateUtil 4.2 调用命名空间模块 我们可以在use关键字后加完整路径来导入命名空间下的模块。例如,导入FileLog模块: use system::log::FileLog //全路径调用 system::log::FileLog::appendLog("mylog.txt", "test my log") //直接调用已导入模块中的函数 appendLog("mylog.txt", "test my log") 5. 在GUI中远程调试模块 当工作机和DolphinDB服务器不是同一台机器时,我们在工作机上编辑的模块代码,不能直接在远程服务器的DolphinDB上通过use导入,需要先将模块文件上传到[home]/modules的对应目录,才能通过use调用模块。 DolphinDB GUI从0.99.2版本开始提供了远程同步模块的功能,具体用法如下图所示: 此操作会将Modules目录下的所有文件和子目录同步到GUI连接的DolphinDB节点的[home]/modules目录下,同步完成后,就可以直接执行use导入模块。 6. 注意事项 6.1 同名函数定义规则 不同模块可以定义相同名字的函数。如果使用全路径调用函数,DolphinDB可以通过模块命名空间来区分函数名。如果直接调用函数: 如果已导入的模块中只有一个模块包含该函数,DolphinDB会调用该模块的函数。 如果已导入的模块中有多个模块包含该函数,DolphinDB解析脚本时会以下抛出异常: Modules [Module1] and [Module2] contain function [functionName]. Please use module name to qualify the function. 如果已导入模块中与自定义函数重名,系统会默认使用模块中的函数。如果要调用自定义函数,需要声明命名空间。自定义函数和内置函数的默认命名空间为根目录,用两个冒号表示。比如: //定义模块 module sys def myfunc(){ return 3 } //自定义函数 login("admin","123456") def myfunc(){ return 1 } addFunctionView(myfunc) //调用 use sys sys::myfunc() //调用模块的函数 myfunc() //调用模块的函数 ::myfunc() //调用自定义函数 如果已导入的模块中不包含该函数,DolphinDB会在系统内置函数中搜索该函数。如果内置函数中也没有该函数,将抛出函数为定义的异常。 6.2 刷新模块定义 在开发阶段调试模块代码时,如果需要反复修改模块代码并刷新定义,只需重新执行模块文件中的代码即可,这种方法仅对当前会话有效。 6.3 模块间的互相调用 模块之间可以单向引用,比如模块a引用模块b,模块b引用模块c,不支持交叉引用,比如模块a引用模块b,模块b引用模块a。

优秀的个人博客,低调大师

Redis 6.2-RC3 发布,高性能内存数据库

Redis 6.2-RC3 发布了,这是 6.2 系列的第 3 个候选者版本,与 RC2 相比有更完整的更新列表。 主要更新内容 新命令/参数 添加 HRANDFIELD 和 ZRANDMEMBER 命令 添加 FAILOVER 命令 添加 GETEX、GETDEL命令 SET 命令增加PXAT/EXAT 参数 FLUSHALL 和 FLUSHDB 命令增加 SYNC 参数,SCRIPT FLUSH命令增加ASYNC/SYNC 参数 Sentinel 向 Sentinel 添加主机名支持 防止文件描述符泄漏到 Sentinel 脚本中 修复配置文件行顺序依赖性和配置重写顺序 新的配置选项 添加 set-proc-title 配置选项以禁用对进程标题的更改 添加 proc-title-template 选项以控制进程标题中显示的内容 添加 lazyfree-lazy-user-flush 配置选项以控制 FLUSHALL、FLUSHDB 和 SCRIPT FLUSH Bug 修复 AOF:通过打开/关闭 appendonly 配置从上次写入错误中恢复 当 AOF fsync 策略为“总是”时,退出 fsync 错误 测试 arm64 CoW 错误时,避免断言(在较早的内核上) CONFIG REWRITE 应该接受 umask 设置 修复某些命令中的 firstkey、lastkey 和 step 详细内容请查看更新公告。

优秀的个人博客,低调大师

干货丨时序数据库DolphinDB横截面引擎教程

在处理实时流数据时,不仅需要按照时间做纵向聚合计算(时间序列聚合引擎),还需要对最新的数据做横向比较和计算,如金融里对所有股票的最新报价求百分位、工业物联网中计算一批设备的温度均值等。DolphinDB database 提供了横截面聚合引擎,可以对流数据中所有分组的最新数据做聚合运算。 横截面引擎的主体分为两部分:横截面数据表和计算引擎。横截面数据是横截面引擎的内部表,保存了所有分组最新的截面数据。计算引擎是一组聚合计算表达式以及触发器,系统会按照指定的方式触发聚合运算,计算结果会输出到另外一个表中。 1. 基本用法 在DolphinDB database中,通过createCrossSectionalAggregator创建横截面聚合引擎。它返回一个横截面数据表,保存了所有分组最新的截面数据,往这个表写入数据意味着这些数据进入横截面聚合引擎进行计算。具体用法如下: createCrossSectionalAggregator(name, [metrics], dummyTable, [outputTable], keyColumn, [triggeringPattern="perBatch"], [triggeringInterval=1000]) name是一个字符串,表示横截面聚合引擎的名称,是横截面聚合引擎的唯一标识。它可以包含字母,数字和下划线,但必须以字母开头。 metrics是元代码。它可以是系统内置或用户自定义的函数,如<[sum(qty), avg(price)]>,可以对聚合结果使用表达式,如<[avg(price1)-avg(price2)]>,也可以对计算列进行聚合运算,如<[std(price1-price2)]>。详情可参考元编程。 dummyTable是表对象,它可以不包含数据,但它的结构必须与订阅的流数据表相同。 outputTable是表对象,用于保存计算结果。输出表的列数为metrics数量+1,第一列为TIMESTAMP类型,用于存放发生计算的时间戳,,其他列的数据类型必须与metrics返回结果的数据类型一致。 keyColumn是一个字符串,指定dummyTable的某列为横截面聚合引擎的key。keyColumn指定列中的每一个key对应表中的唯一一行。 triggeringPattern是一个字符串,表示触发计算的方式。它可以是以下取值: "perRow": 每插入一行数据触发一次计算 "perBatch": 每插入一次数据触发一次计算 "interval": 按一定的时间间隔触发计算 triggeringInterval是一个整数。只有当triggeringPattern的取值为interval时才生效,表示触发计算的时间间隔。默认值为1000毫秒。 2. 示例 下面通过一个例子说明横截面聚合引擎的应用。在金融交易中,往往需要实时了解所有股票最新的报价均值、最近一次成交量总和以及最近一次交易的交易量。DolphinDB的横截面聚合引擎结合流数据订阅功能可以方便地完成这些工作。 (1)创建实时交易表 股票的实时交易表trades,包含以下主要字段: sym:股票代码 time:时间 price:成交价 qty:成交量 每当交易发生时,实时数据会写入trades表。创建trades表的脚本如下: share streamTable(10:0,`time`sym`price`qty,[TIMESTAMP,SYMBOL,DOUBLE,INT]) as trades (2)创建横截面聚合引擎 tradesCrossAggregator=createCrossSectionalAggregator("CrossSectionalDemo", <[avg(price), sum(qty), sum(price*qty)]>, trades, outputTable, `sym, `perRow) tradesCrossAggregator是横截面数据表,它按股票代码分组,每个股票有且仅有一行。当数据进入该表时,会计算每个股票的avg(price), sum(qty)和sum(price*qty)。每插入一条数据触发一次计算。 (3)横截面数据表订阅实时交易表 subscribeTable(,"trades","tradesCrossAggregator",-1,append!{tradesCrossAggregator},true) 通过流数据订阅功能,把实时数据写入横截面数据表。 (4)模拟数据产生 def writeData(n){ timev = 2000.10.08T01:01:01.001 + timestamp(1..n) symv = take(`A`B, n) pricev = take(102.1 33.4 73.6 223,n) qtyv = take(60 74 82 59, n) insert into trades values(timev, symv, pricev,qtyv) } writeData(4); 查看实时交易表,共有4条数据。 select * from trades time sym price qty ----------------------- --- ----- --- 2000.10.08T01:01:01.002 A 102.1 60 2000.10.08T01:01:01.003 B 33.4 74 2000.10.08T01:01:01.004 A 73.6 82 2000.10.08T01:01:01.005 B 223 59 查看横截面数据表,里面保存了A、B两只股票最近的两笔交易记录。 select * from tradesCrossAggregator time sym price qty ----------------------- --- ----- --- 2000.10.08T01:01:01.004 A 73.6 82 2000.10.08T01:01:01.005 B 223 59 查看横截面引擎的输出表,由于横截面引擎采用了perRow每行触发计算的频率,所以每往横截面表写入一行数据,聚合引擎都会做一次计算,因此一共有4条记录。 select * from outputTable time avgPrice sumqty Total ----------------------- -------- ------ ------- 2019.07.08T10:04:41.731 102.1 60 6126 2019.07.08T10:04:41.732 67.75 134 8597.6 2019.07.08T10:04:41.732 53.5 156 8506.8 2019.07.08T10:04:41.732 148.3 141 19192.2 通过getAggregatorStat函数查看横截面引擎的状态。 getAggregatorStat().CrossSectionalAggregator name user status lastErrMsg numRows numMetrics metrics triggeringPattern triggeringInterval ------------------ ----- ------ ---------- ------- ---------- ------------------ ----------------- ------------------ CrossSectionalDemo guest OK 2 3 [ avg(price), su...perRow 1000 通过removeAggregator函数删除横截面引擎。 removeAggregator("CrossSectionalDemo") 3. 触发计算的几种方式 横截面引擎一共有三种触发计算的方式:perRow、perBatch和interval。上面的例子中采用的是每插入一行数据触发一次计算。下面介绍另外两种触发计算的方式。 perBatch perBatch参数表示每追加一批数据就触发一次写入,下例按perBatch模式启用横截面引擎,脚本一共生成12条记录,分三批写入,输出表中预期有3条记录。 share streamTable(10:0,`time`sym`price`qty,[TIMESTAMP,SYMBOL,DOUBLE,INT]) as trades outputTable = table(1:0, `time`avgPrice`sumqty`Total, [TIMESTAMP,DOUBLE,INT,DOUBLE]) tradesCrossAggregator=createCrossSectionalAggregator("CrossSectionalDemo", <[avg(price), sum(qty), sum(price*qty)]>, trades, outputTable, `sym, `perBatch) subscribeTable(,"trades","tradesCrossAggregator",-1,append!{tradesCrossAggregator},true) def writeData(n){ timev = 2000.10.08T01:01:01.001 + timestamp(1..n) symv = take(`A`B, n) pricev = take(102.1 33.4 73.6 223,n) qtyv = take(60 74 82 59, n) insert into trades values(timev, symv, pricev,qtyv) } //写入三批数据,预期会触发三次计算,输出三次聚合结果。 writeData(4); writeData(4); writeData(4); 查看横截面数据表。 select * from tradesCrossAggregator time sym price qty ----------------------- --- ----- --- 2000.10.08T01:01:01.002 A 73.6 82 2000.10.08T01:01:01.003 B 33.4 59 查看输出表。插入了三批数据,因此输出表中有3条记录。 select * from outputTable time avgPrice sumqty Total ----------------------- -------- ------ ------- 2019.07.08T10:14:54.446 148.3 141 19192.2 2019.07.08T10:14:54.446 148.3 141 19192.2 2019.07.08T10:14:54.446 148.3 141 19192.2 interval 当触发计算的方式为interval时,需要指定triggeringInterval,表示每隔triggeringInterval毫秒触发一次计算。下面的例子中,分6次写入12条记录,每次间隔500毫秒。设置横截面引擎每1000毫秒触发一次计算,预期最终输出3条记录。 share streamTable(10:0,`time`sym`price`qty,[TIMESTAMP,SYMBOL,DOUBLE,INT]) as trades outputTable = table(1:0, `time`avgPrice`sumqty`Total, [TIMESTAMP,DOUBLE,INT,DOUBLE]) tradesCrossAggregator=createCrossSectionalAggregator("CrossSectionalDemo", <[avg(price), sum(qty), sum(price*qty)]>, trades, outputTable, `sym, `interval,1000) subscribeTable(,"trades","tradesCrossAggregator",-1,append!{tradesCrossAggregator},true) def writeData(n){ timev = 2000.10.08T01:01:01.001 + timestamp(1..n) symv = take(`A`B, n) pricev = take(102.1 33.4 73.6 223,n) qtyv = take(60 74 82 59, n) insert into trades values(timev, symv, pricev,qtyv) } a = now() writeData(2); sleep(500) writeData(2); sleep(500) writeData(2); sleep(500) writeData(2); sleep(500) writeData(2); sleep(500) writeData(2); sleep(500) b = now() select count(*) from outputTable 3 如果再次执行select count(*) from outputTable,会发现随着时间的推移,输出表的记录数会不断增长。这是因为在interval模式下,计算是按照现实时间定时触发,并不依赖于是否有新的数据进来。 4. 横截面数据表的独立使用 从上面的例子中可以看出,横截面表虽然是为聚合计算提供的一个中间数据表,但其实在很多场合还是能独立发挥作用的。比如我们需要定时刷新某只股票的最新交易价格,按照常规思路是从实时交易表中按代码筛选股票并拿出最后一条记录,而交易表的数据量是随着时间快速增长的,如果频繁做这样的查询,无论从系统的资源消耗还是从查询的效能来看都不是很好的做法。而横截面表永远只保存所有股票的最近一次交易数据,数据量是稳定的,对于这种定时轮询的场景非常合适。 如果要单独使用横截面表,需要在创建横截面引擎时,把metrics,outputTable这两个参数设置为空。 tradesCrossAggregator=createCrossSectionalAggregator("CrossSectionalDemo", , trades,, `sym, `perRow) 相关链接: 流数据教程 时间序列引擎教程 异常检测引擎教程

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册