运行脚本

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:表示并行度,默认是2。

并行度表示在一个数据节点上,最多同时可以用多少个线程来执行该作业产生的子任务。可参考 DolphinDB 关于作业并行度的介绍

fetchSize

fetchSize:对于大数据量的表,为防止内存占用过多,API 提供了分段读取方法,默认值是0。

当指定了 fetchSize 时,run方法会返回一个 BlockReader 对象,可以通过 read() 方法来循环读取数据。

注: fetchSize 取值不能小于 8192。

clearMemory

clearMemory:表示是否在执行结束后清理内存,默认为 false。

使用 run 方法时,有时为减少内存占用,希望 server 能在执行完毕后自动释放 run 语句中创建的变量。此时可通过指定 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 已被销毁