在多线程 一文中,我们了解了在集算器中,如何执行多线程计算来提高效率。除了编写网格代码时用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条数据如下:
如需了解更多有关内容,请阅读游标归并与连接。