首页 > 解决方案 > 如何使用设备进行并行绘图?

问题描述

我想在一堆国家/地区运行 CPU 密集型绘图功能。因此我尝试并行化我的代码,但是到目前为止我没有得到任何输出。我x11()用于测试和pdf()最终结果。

正常的代码是这样的,

x11(width=7, height=7)  # comment out for pdf output
# pdf("plot.pdf")  # un-comment for pdf output
op <- par(mfrow=c(3, 3))
sapply(unique(dat$country), function(x)
  with(dat[dat$country == x, ], 
       plot(year, value, type="l",                 # complicated plotting function
            main=x,                                #
            xlim=c(2014, 2019), ylim=0:1, col=2))  #
  )
par(op)
# dev.off()  # un-comment for pdf output

使用此输出:

在此处输入图像描述

这里我尝试并行化。

library(parallel)
x11(width=7, height=7)  # comment out for pdf output
# pdf("plot.pdf")  # un-comment for pdf output
op <- par(mfrow=c(3, 3))
cl <- makeCluster(detectCores() - 1)
clusterExport(cl, c("dat"), envir=environment())
parSapply(cl, 1:length(unique(dat$country)), function(x, ...) {
  with(dat[dat$country == x, ], 
       plot(year, value, type="l",                 # complicated plotting function
            main=unique(dat$country)[x],           #
            xlim=c(2014, 2019), ylim=0:1, col=2))  #
  })
stopCluster(cl)
par(op)
# dev.off()  # un-comment for pdf output

代码运行,但输出似乎没有以某种方式发送到设备。我怎么能解决这个问题?

数据

set.seed(42)
dat <- cbind.data.frame(expand.grid(country=replicate(9, paste(LETTERS[sample(seq(26), 2)], collapse="")),
                                    year=2014:2019),
                        value=runif(54))

标签: rplotconcurrencyparallel-processing

解决方案


我该如何解决?

序言:
虽然有流程组织,可能允许某些步骤以真正的方式发生(开始、执行和终止)[PARALLEL],但还有更多的情况,根本无法以这种方式操作,他们甚至不应该明确要求一个接一个的纯粹[SERIAL]组织(已完成)。流程流的“公正”[CONCURRENT]组织可能会利用一些有限数量的可用资源(内存-I/O 跨“公正”-3 个内存通道,存在一个“公正”-6-CPU 核心等)当且仅当这些是免费的,否则。

然而,所有这一切都是有代价的…… (有关并行性附加成本的详细信息,参见

这说:
绘图肯定是一个纯[SERIAL]过程。一步一步地应用在这里。从打印机设备,通过打印机接口,直到 PostScript 或其他打印设备控制语言的打印机任务(事务)解释 - 都被事务锁定(不应该同时打印两个文档,但是而是一个接一个,就像如果只使用一支铅笔和一把尺子,你永远不会在同一张纸上同时得到两个图表,对吗?)。


选项 ?

  • 可以事先准备所有数据(并行,如果与重新组织的处理附加成本流相关的所有此类重构至少有理由不支付多于接收的方式(因此有效的加速没有得到< = 1 ) ),然后将这些预烘焙的打印就绪数据输入主要是纯[SERIAL]打印/绘图引擎队列(一个接一个,无需等待数据被处理,因为这些是事先准备好的)

或者

  • 可以预先准备所有的{.PDF|.EPS|.PS}绘图作为单独的绘图文件(并行(更可能以“公正”[CONCURRENT]方式的某种受控形式 - 因为磁盘 I/O 和 CPU 内核是明显的瓶颈和某种形式的如果尝试组织比现有 CPU 内核数量更多的工作流,例如某些 I/O 绑定函子的异步/延迟完成,I/O 延迟屏蔽大约是最大的受益者, 如果实现语言可以提供, 仍然是 )如果所有附加成本至少有理由不支付超过接收的方式) 并使用 {PDF|PS} 语言权力进行最终的文档组合, 这将,出于显而易见的原因,将先前准备的文件重新组装成一个最终输出,以纯[SERIAL]方式组成。

推荐阅读