我们在“kdb+并行计算(1)”和“kdb+并行计算(2)”聊了多线程并行计算和多进程并行计算,那么,我们是否可以同时进行两种并行计算呢?当然是可以的。我们举一个稍“复杂”一些的简单例子:计算a*b, a=1,2,3, b=1,2,3,4,5,如下表所示:
要求:同一行计算在同一个q中进行,该行的每一列在不同的线程中计算。操作步骤如下:
操作步骤
1
第一步,启动一个主q和多个子q
启动主q:
set QHOME=d:\kdb\q
start d:\kdb\q\w32\q -s -3
(注意参数是-s -3不是-s 3)
启动3个子q,均启用多线程:
start “5501” d:\kdb\q\w32\q -p 5501 -s 5
start “5502” d:\kdb\q\w32\q -p 5502 -s 5
start “5503” d:\kdb\q\w32\q -p 5503 -s 5
(注意参数是 -s 5 不是 -s -5)
2
第二步,建立主q与子q之间的通信连接
在主q中执行:
.z.pd:`u#hopen each 5501 5502 5503
3
第三步,主q向子q分发计算任务
在主q控制台上运行:
{[a] -1 “a=”,string[a]; {[a;b] -1 string[a],"",string[b],"=",string[ab];a*b}[a] peach 1 2 3 4 5} peach 1 2 3
主q将返回:
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
子q 5501将显示:
a=1
11=1
12=2
13=3
14=4
1*5=5
子q 5502将显示:
a=2
21=2
22=4
23=6
24=8
2*5=10
子q 5503将显示:
a=3
31=3
32=6
33=9
34=12
3*5=15
注意:“a*b=x”的实际显示顺序与上面顺序会有所不同。
说明:本文经授权转载自微信公众号kdbcnbook。