3

简而言之,问题是:我必须在绘图上可视化优化过程。在预先绘制的设备上,新的解决方案(如点(x,y))应该在可用时出现。我有一个嵌套循环的工作顺序代码,但应该可以使其并行。我尝试了 foreach 包(使用 doParallel 后端),但生成的进程无法在父进程的设备上绘图 - 显然。是否有可能通过另一个包或无论如何来克服这个问题?

4

2 回答 2

1

我认为不可能将一个进程绘制到 R 中另一个进程的图形设备上。相反,进程需要将消息发送到执行所有图形操作的指定进程。使用parallel 或foreach/doParallel 会相当困难,但是使用foreach 和支持即时处理worker 结果的并行后端(例如doMPI 或doRedis)相对容易。在这种情况下,您可以在 combine 函数中绘制由工作人员计算的点。这是一个简单的例子:

library(doMPI)
nworkers <- 4
cl <- startMPIcluster(nworkers)
comm <- cl$comm  # get communicator number
registerDoMPI(cl)
cap <- capabilities()
if (cap['aqua']) quartz() else if (cap['X11']) X11() else windows()
plot(integer(0), integer(0),
     main='Random points generated by doMPI workers',
     xlab='X', ylab='Y', xlim=c(1,100), ylim=c(1,100))
legend('topright', sprintf('worker %d', 1:nworkers), pch=1:nworkers)

# The argument "p" is a list of arguments to the function "points"
plotpoint <- function(x, p) {
  do.call('points', p)
  x
}

foreach(i=icount(100), .combine='plotpoint',
        .init=NULL, .inorder=FALSE) %dopar% {
  Sys.sleep(abs(rnorm(1, mean=3)))
  list(x=sample(100,1), y=sample(80,1), pch=mpi.comm.rank(comm))
}
text(50, 90, 'Finished')
Sys.sleep(10)

closeCluster(cl)
mpi.quit()

我丢弃了结果,因为它们仅用于调用points,但您可以修改plotpoint以将部分结果保存在第一个参数x中。只需确保将.init参数修改为适当的数据结构即可。

于 2013-11-13T16:53:33.740 回答
0

您也许可以尝试这样的事情:

foreach(i=1:10) %dopar% with(env.profile(.GlobalEnv), #Your Code#)

我不确定这是否可行。由于使用基本 R 图形作品进行绘图的顺序性质,您可能会遇到问题。您也可以尝试创建一个列表,并在 %dopar% 调用期间将每次迭代的结果添加到列表中。完成后,您应该可以使用 lapply(point.list, points)。

于 2013-11-12T22:25:57.510 回答