我想使用以下方法来监控一个脚本的进度 parfor
. 不幸的是,由于它需要大量的计算能力和时间,我必须在远程多处理器计算机上启动它,使用的是 nohup
.
作为第一次尝试,我使用了 fprintf
以使每个并行实例都有一个输出,即
parfor i = 1:N
fprintf('Computing instance %i out of %i\n', i, N)
% Other code
end
并计算 "instance "一词在本例中的出现次数。nohup
输出文件,使用 grep
. 然而,由于 N
顺序为 ~ 1E8 ~
一些数以亿计的,输出文件变得巨大,所以我想避免它。
然后,我开始尝试一些 parfor
进度条,我在网上可以找到。但是,大部分都是用图形输出的,其他几个都有一些缺点,如果与 nohup
(比如在输出文件中我发现进度条的每一次更新,所以输出文件又会很大)。
我如何有效地监控一个 parfor
,而使用 nohup
?
Q : "我如何才能有效地监测一个
parfor
,而使用nohup
?"
我更倾向于使用ZeroMQ JeroMQ-port,并从内部明确发出信号。parfor
任何实际(相关)进展。
import org.zeromq.ZMQ;
aCtx = zmq.Ctx();
ADDR = 'tcp://127.0.0.1:75757';
parfor i = 1:N
fprintf( 'Computing instance %i out of %i\n', i, N );
%---------------------------------------------------------------------
aSocket = aCtx.createSocket( ZMQ.PUB );
aSocket.connect( ADDR );
aMessage = zmq.Msg( 9 );
aMessage.put( unicode2native( 'SIG:START' ) );
aSocket.send( aMessage, 1 );
%---------------------------------------------------------------------
% Other code
%---------------------------------------------------------------------
aMessage = zmq.Msg( 7 );
aMessage.put( unicode2native( 'SIG:END' ) );
aSocket.send( aMessage, 1 );
aSocket.close();
%---------------------------------------------------------------------
end
为此,您将需要一个 SUB
-用户端,收集所有的信号信息,很明显的 .bind()
并在上述规定的 ADDR:PORT
地址,有GUI还是无头,都取决于你喜欢的语言&显示器的需求。
重复使用Will Grant的安装 忠告 以及他或她所提及的链接 此处.
如果一个人从来没有使用过 ZeroMQ在这里,我们可以先看看 "ZeroMQ。原则 不到 五秒" 刨根问底