本节内容非应用程序员可以跳过,不影响正常阅读。
游标中的数据是来源于单一个文件或者数据库的,有时候,数据有可能来自并列的多个游标的,此时可以定义多路游标来采用并行的方式执行。
多路游标需要用CS.cursor() 函数定义,可以像普通游标一样通过fetch取数。如:
|
A |
1 |
=file("Order_Wines.txt") |
2 |
=file("Order_Electronics.txt") |
3 |
=file("Order_Foods.txt") |
4 |
=file("Order_Books.txt") |
5 |
=[A1:A4].(~.cursor@t()).cursor() |
6 |
=A5.select(SalesID==1).fetch() |
在A5中,用A1~A4中的文件生成游标序列,再创建多路游标。在A6中,可以将A5中的多路游标作为单个游标一样使用。A6中的计算结果如下:
需要注意的是,从多路游标中读取的数据会合并到一个序表中,所以游标序列中,各个游标中的记录需要具有相同的表结构。另外,由于是采用并行计算处理各个游标的取数,因此结果中数据的顺序是不定的。
并行计算能够有效地提高计算效率,除了使用多个游标构成序列,也可以通过cs.cursor@m(n) 函数,基于单个游标cs生成n个并行子游标构成的多路游标,当n空缺时,将自动设置并行数。如:
|
A |
1 |
=file("Order_Wines.txt") |
2 |
=A1.cursor@t() |
3 |
=A2.cursor@m(4) |
4 |
=A3.select(month(Date)==10) |
5 |
=A4.fetch() |
基于单个游标生成的多路游标除了会采用并行方式取数之外,与普通的游标使用方法相同,但是从多路游标中取数时,结果的次序不确定。计算后,A5中的结果如下:
除了用cs.cursor@m() 将普通游标转换为多路游标之外,还可以通过A.cursor@m() 和函数f.cursor@m(),直接生成从序列或文件取数的多路游标。
如果使用CS.merge(x) 将游标序列CS中各个游标的数据合并时,CS中成员是多路游标,则CS中的所有游标必须有着相同的路数。类似的还有使用joinx() 函数来将多个游标中的数据连接起来时,如果游标中存在多路游标,那么这些用来连接的游标必须都是多路游标,且路数相同。