内置并行

阅读(4738) 标签: 内置并行,

多线程 一文中,我们了解了在集算器中,如何执行多线程计算来提高效率。除了编写网格代码时用fork来实现多线程并行计算,集算器也在一些函数中提供了内置并行的解决方案,我们将在下面了解这些内容。

并行读取数据

在读取数据表时,如果记录的顺序对计算结果没有影响,则可以用多线程来处理,从而更充分地利用系统资源,以达到提高效率的目的。如果需要使用多线程并行处理,需要在使用函数时添加@m选项,多线程并行读取数据的函数主要是f.import@m()

读取单个数据文件中的数据时,可以用多线程并行的方法。如:

 

A

B

1

=file("PersonnelInfo.txt")

=now()

2

=A1.import@t()

=now()

3

=A1.import@mt()

=now()

4

=string(interval@ms(B1,B2))+"/"+string(interval@ms(B2,B3))

 

A2中直接读入数据,A3中添加了@m选项,使用f.import@m(),多线程读取数据。在A4中比较了两种方法的耗时,结果如下:

使用并行读取数据的方法,也可以获得明显的性能提升。

在多线程读取单数据文件时,系统会将文件拆分为多个部分,分别构成文件游标来分段读取记录。读取数据时,这些文件游标将各自使用独立的线程,类似于上一个例子中多线程读取数据的情况。如果想更详细地了解集算器中如何分段读取数据,请阅读集文件

由于并行读取单个数据文件中的数据,因此在结果中记录的顺序也是不定的,不一定完全按顺序返回。

 

在使用f.import@m()时,使用的线程数是由设定的Parallel number of task决定的。这个参数可以在集算器菜单栏中点击Tool>Option,在General页面中设定:

有序归并游标

还有一种必须在并行时才能完成的计算,就是游标的有序归并,CS.merge()。如下面的例子:

 

A

B

1

=file("Order_Wines.txt").cursor@t()

=file("Order_Foods.txt").cursor@t()

2

=file("Order_Electronics.txt").cursor@t()

=file("Order_Books.txt").cursor@t()

3

=[A1:B2].merge(Date)

=A3.fetch(10000)

4

>A3.close()

 

A3中,将4个文本中的订单数据根据日期有序归并,得到新的游标。

在处理游标的有序归并时,需随时根据排序表达式,判断从哪一个游标中读取数据。这样,在计算过程中,各个游标都需要同时存在,这也是需要多线程处理的问题。在集算器中,在计算游标的有序归并时,同样会自动使用并行的方法,不必再添加@m选项。

B3中取出前10000条数据如下:

如需了解更多有关内容,请阅读游标归并与连接