FAQ > 金融建模 > 效率优化 > 数据计算效率优化

Q:使用网格计算提高计算效率时,如何合理控制并发数?    

简述
天软账号的并发数是有限的,一般是5个。当账号的全部并发数被消耗掉,会导致并发数被重新释放之前的这一段时间内,用户无法再执行新的任务。因此,在使用网格计算时,需要合理的控制并发数。
  • 如何确定可使用的最大并发数:
    由于在执行任务时,主程序会占用一个并发数,所以,可使用的最大并发数会小于账号的总并发个数。
    账号如果是多人使用的,也要考虑到其他使用者,避免影响他人的使用。因此,需要结合用户自身情况,确定好可用的最大并发数。
    :如何查看当前账户的并发数,可参考Q:任务管理说明中的info或ou命令的使用说明。

    如何将任务分割成可网格执行的子程序:
    可网格执行的子程序一般是相互独立的,与不依赖主程序,只需传入参数即可获取到对应的结果。
    因此,子程序的封装可以从证券代码、日期时间或样本长度等维度出发。
    比如下述提取全A股证券相关指标的范例,就是通过证券代码将任务进行分割的。

    如何通过程序控制任务执行时的并发数:
    通过指定最大并发数对程序的网格数进行控制。
    下述范例中,通过指定的最大并发数,将证券代码集合进行分割。分割后的证券代码通过循环分发给并发任务;在最后一次循环中,并发任务已分发完成,主程序继续执行最后一部分任务。
    需要注意,尽量避免频繁分发并发任务,会导致阻塞时间过长,影响效率。

    下述是执行范例代码时,采用了不同的网格数进行计算所消耗的时间对比,仅供参考。
    使用的网格数取数完成消耗的时间(s)
    不使用网格64.1135
    238.7631
    416.9317
    810.7717

    范例:
    //获取全A股指定日期区间的多个指标
    Function TSDN_BFDemo();
    begin
     bf:=4;//最大并发数
     begt:=20210101t;
     endt:=20210112t;
     stocks:=getbk("A股");
     sLen:=length(stocks);
     n:=sLen div bf;//每个并发任务分配的证券个数
     rt:=array();
     ret:=array();
     for i:=0 to bf-1 do
     begin
      if i<>bf-1 then
       ret[i]:=#GetStocksDataByQK(stocks[n*i:n*(i+1)-1],begt,endt);
      else
       ret[i]:=GetStocksDataByQK(stocks[n*i:sLen-1],begt,endt);
     end
     for j in ret do
      rt&=dupvalue(ret[j]);
     return rt;
    End;

    //取指定日期区间多个股票的指标
    Function GetStocksDataByQK(stocks,begt,endt)
    begin
     ov2:=BackupSystemParameters2();
     setsysparam(pn_cycle(),cy_day()); //周期
     data:=array();
     n:=0;
     for i:=0 to length(stocks)-1 do
     begin
      stock:=stocks[i];
      setsysparam(pn_stock(),stock); //设置当前证券代码
      dayList:=stocktradedayqk(begt,endt); //取当前证券的交易时间序列
      for j:=0 to length(dayList)-1 do //时间循环
      begin
       dayEnd:=dayList[j];
       setsysparam(pn_date(),dayEnd);//设置当前时间,给不需要时间参数的指标提供指定日
       data[n]['StockID']:=stock;
       data[n]['StockName']:=stockName(stock);
       data[n]['Date']:=datetostr(dayEnd);
       //获取多个指标值
       data[n,'收盘价']:=close();
       data[n,'成交量']:=vol();
       data[n,'涨幅(%)']:=stockzf3();
       data[n,'macd']:=MACD_MACD_v(12,26,9);
       data[n,'ema_10']:=Ema_v(10);
       //还可以继续添加其它指标
       //data[k,'xxx']:=funcxxx(...);
       n++;
      end;
     end
     return data;
    end


    相关链接:
    FAQ:Q:天软网格计算
    FAQ:Q:网格计算时报错:Grid pending count exceed limited
    FAQ:Q:网格执行报错:Result return error,maybe size too large/gridcompute error
    FAQ:Q:网格执行的函数有什么要求?
    FAQ:Q:在网格中如何指定服务器进行运算