多路游标

阅读(2813) 标签: 多路游标, mcursor@m, 并行数, merge, joinx,

本节内容非应用程序员可以跳过,不影响正常阅读。

游标中的数据是来源于单一个文件或者数据库的,有时候,数据有可能来自并列的多个游标的,此时可以定义多路游标来采用并行的方式执行。

多路游标需要用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() 函数来将多个游标中的数据连接起来时,如果游标中存在多路游标,那么这些用来连接的游标必须都是多路游标,且路数相同。