kdb+并行计算(2)

我们在“kdb+并行计算(1)”中聊了在同一个kdb+/q中同时跑多个小任务(即多线程并行计算),这种并行计算比较简单,但存在一些不足,例如,用于跑小任务的子线程可以读取全局变量,不能写全局变量等等。

这里聊聊另外一种并行计算方法:把大任务拆成许多小任务,将这些小任务扔到不同的q上跑。由于一个运行中的q叫一个进程,所以这种并行计算就叫多进程并行计算。它可以进一步分为两种,一种是执行小任务的多个q跑在同一台电脑上,另一种是多个q跑在不同的多台电脑上。

由于多台不同电脑上的q之间互相通信十分简单(可参考《kdb+中文教程》第八章第三节),所以学会让小任务同时跑在同一台电脑不同的q上面,就会让它同时跑在多台不同电脑的q上面。

下面我们仍然以“kdb+并行计算(1)”的简单例子(计算1、2、3的平方),聊一下如何进行多进程并行计算。直接给出操作步骤:

操作步骤
1
第一步,启动一个主q和多个子q
启动一个用于控制的q,称其为主q(主进程),这个q用于分发计算任务和汇总计算结果。同时,启动3个用于执行小任务的q,称其为子q(子进程)。

启动主q:(假设32位q for Windows安装在d:\kdb\q)
set QHOME=d:\kdb\q
start d:\kdb\q\w32\q -s -3
这里 -s -3 (注意是负3 不是正3 )的作用是指定并行计算时可以用到3个子q。

启动3个子q:
start “5501” d:\kdb\q\w32\q -p 5501
start “5502” d:\kdb\q\w32\q -p 5502
start “5503” d:\kdb\q\w32\q -p 5503
由于主q需要与3个子q通信,所以3个子q需要指定监听端口,这里假设为5501、5502和5503。
2
第二步,建立主q与子q之间的通信连接
主q要将计算任务分发给3个子q执行,需要建立一个通信通道。在q中这个通道用一个数字表示,称为连接句柄。连接句柄保存在q指定的.z.pd变量中。在主q中执行:
.z.pd:u#hopen each 5501 5502 5503 其中,hopen each 5501 5502 5503 实现主q分别与3个子q建立连接,返回连接句柄,我们将3个连接句柄加u(唯一)属性后保存到.z.pd。主q向子q分发计算任务时,将从.z.pd获得连接句柄,从而主q知道应该往哪几个子q发送计算任务。
3
第三步,主q向子q分发计算任务
在主q控制台上运行:
{-1 string[x]; x*x} peach 1 2 3

主q将{-1 string[x]; xx} 和参数1发到端口为5501的子q执行,子q将执行{-1 string[x]; xx}[1],在控制台显示 1(-1 “…“的作用是在控制台显示”…”),将计算结果1的平方返回主q;同时主q将{-1 string[x]; x*x} 和参数2发到端口为5502,在5502上显示2,同时将2的平方返回给主q;……
当3个小任务均执行完成后,主q获得计算结果,得到一个结果数组(1;4;9)。

通过上面三步可以实现多进程并行计算,当然这只是一个很简单的例子,实际上还许多细节问题可以进一步学习,请参考《kdb+中文教程》第九章相关内容或者https://code.kx.com。

如果要让小任务并行跑在不同电脑上的q上面,与上面步骤不同的是第一、二步,即需要在不同电脑上启动q,主q需要连接不同电脑上的q,均很简单可以实现,具体可以参考上述资料。

说明:本文经授权转载自微信公众号kdbcnbook。
kdbcn

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值