gpt4 book ai didi

r - 是否有可能并行地做一个共同的情节(与 foreach)?

转载 作者:行者123 更新时间:2023-12-02 03:41:11 27 4
gpt4 key购买 nike

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

最佳答案

我认为在 R 中不可能将一个进程绘制到另一个进程的图形设备。相反,这些进程需要将消息发送到执行所有图形操作的指定进程。使用并行或 foreach/doParallel 会相当困难,但将 foreach 与支持实时处理工作结果的并行后端一起使用相对容易,例如 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 参数修改为适当的数据结构即可。

关于r - 是否有可能并行地做一个共同的情节(与 foreach)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19940816/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com