运行脚本
API 支持通过 DBConnection::run
方法来运行 DolphinDB 脚本,该方法的声明如下:
ConstantSP run(const string& script, int priority=4, int parallelism=2, int fetchSize=0, bool clearMemory = false);
参数说明如下:
script
script
:表示待执行的脚本。
priority
priority
:表示优先级,默认是 4。
优先级表示系统赋予作业的优先数,用于决定作业调度的先后顺序。
在 DolphinDB 中,作业按照优先级进行调度。优先级的取值范围为 0-9,取值越高则表明优先级越高。对于优先级高的作业,系统会优先给与计算资源。基于作业的优先级,DolphinDB 设计了多级反馈队列来调度作业的执行。具体来说,系统共维护了10个队列,分别对应10个优先级。系统总是将线程资源分配给高优先级的作业;当一个高优先级队列为空时,系统才会处理低优先级队列中的作业;对于处于相同优先级的作业,系统会以 round-robin 的方式将线程资源分配给作业。
parallelism
parallelism
:表示并行度,默认是 64。
并行度表示在一个数据节点上,最多同时可以用多少个线程来执行该作业产生的子任务。可参考 DolphinDB 关于作业并行度的介绍。
fetchSize
fetchSize
:对于大数据量的表,为防止内存占用过多,API 提供了分段读取方法,默认值是 0。
当指定了 fetchSize 时,run方法会返回一个 BlockReader 对象,可以通过 read()
方法来循环读取数据。
clearMemory
clearMemory
:表示是否在执行结束后清理内存,默认为 false。
使用 run 方法时,有时为减少内存占用,希望 server 能在执行完毕后自动释放 session 中创建的变量。此时可通过指定 clearMemory 为 true 来实现。
返回值
返回脚本执行结果。
使用示例
例子1:
std::cout << conn.run("1 + 1")->getInt() << std::endl; //执行并输出计算1 + 1的结果
conn.run("t = table(1:0, `time`avgPrice`volume`dollarVolume`count, [TIMESTAMP,DOUBLE,INT,DOUBLE,INT])"); //在server端创建一个表,名字为t
TableSP tbl = conn.run("select time, avgPrice from t"); //执行sql语句进行查询
例子2:
std::string testBlock = R"(
rows=100001; //通过脚本创建一个100001行的表
testblock=table(take(1,rows) as id,take(`A,rows) as symbol,take(2020.08.01..2020.10.01,rows) as date, rand(50,rows) as size,rand(50.5,rows) as price);
)";
conn.run(testBlock);
BlockReaderSP reader = conn.run("select * from testblock", 4, 2, 10000); //读取表的内容,每次读10000行
//统计读到的总行数
int totalNum = 0;
while(reader->hasNext()){
TableSP t = reader->read();
totalNum += t->size();
}
//输出100001
std::cout << totalNum;
例子3:
conn.run("n = 1", 4, 2, 0, true); //创建一个变量n为1,由于 clearMomery 参数为true,该变量在执行之后会销毁
conn.run("n"); //这句会抛出异常,因为 n 已被销毁