您的位置:首页 > 其它

R 语言parallel并行画图 ggplot2 图片

2017-02-24 20:44 253 查看
很久没有写博客了

发现博客看的最多的还是自己实现简单代码的东西

但太懒了,现在都是调用包

前几天, 觉得自己程序太慢, 于是乎将其并行化

搜了几个博客, 发现例子都是一样的

不明觉厉

但内容够用

只是由于我当时的程序是生成参数和图片一起生成的(还是代码写的少,结构化的东西应该分开, 已经分开了…), 所以需要并行图片。

好了废话少说:

并行分为 master -> slave 节点

开始时master -> slave 传送数据, 然后最终收回(至于怎么收回何时收回,不懂…)

建议先看这个链接,算是入门吧:
http://blog.itpub.net/24229571/viewspace-1120592/


# 给并行主函数里的参数赋值, 主函数在下面
PRE_OR_NOT <- ....
maxTrain <- ....
maxTest <- ....

cat("parallel begin...  \n")
parallel.time.start <- Sys.time()
#parallel
core.num <- detectCores(logical = F) #detect core numbers
cl <- makeCluster(core.num - 1) # set core numbers in parellel
#只在master(即Rstudio 打印)
cat("core number is",core.num," \n") #Print Core Number

#注册节点
registerDoParallel(cl) #register
#pass all args to every node

#slave 向 master 传递的并行函数需要调用的函数,或包
#我传递的是sourc("./LM.R")
clusterEvalQ(cl, source("...R"))
clusterEvalQ(cl, library(dplyr))
clusterEvalQ(cl, library(ggplot2))
#传递所需除并行参数外 函数中所需的其他变量, 以list形式传递
#如果在一个函数中调用并行, 就需要加envir=environment()
clusterExport(cl, list("PRE_OR_NOT", "maxTrain", "maxTest"),
envir=environment())
#使用parLapply 并行, par_mainfunc就是并行函数, 主要是用来划分数据集比较好用
#当然也可以使用foreach, parSapply等等
#结果是以list返回
all.res <- parLapply(cl, all.data.path, par_mainfunc)

#res after-process
all.res.plot <- do.call(rbind, all.res)[, "plot"]
tmp.parameters.list <- do.call(rbind, all.res)[, "res"]
all.res.parameters <- do.call(rbind, tmp.parameters.list)
#保存结果 save parameters  res
write.csv(all.res.parameters, file = pre.csvname, row.names = FALSE )

#保存图片结果 save pic res
library(gridExtra)
ggsave(filename = pdfname, width = 5, height = 5, marrangeGrob(grobs = all.res.plot, nrow = 2, ncol = 2))

parallel.time.end <- Sys.time()
cat("Parallel cost time: ", parallel.time.start - parallel.time.end, "\n")

------------------------------------------
# 并行主函数
# 在此主要说一下返回值
# 以说明后处理
"PRE_OR_NOT", "maxTrain", "maxTest"
par_mainfunc <- function(file.path){
# Function narratives
#
# Args:
#  PRE_OR_NOT : ...
#  maxTrain: ...
#  maxTest: ...
#
# Return:
#  A list
在这个函数里包含 除了要划分的数据外,传递的参数:"PRE_OR_NOT", "maxTrain", "maxTest"

#注意要给plot赋值
p <- ggplot2() + geom_point() + ....

#res和plot是list的名字 自己起的
return (list(res = tmp.para.res, plot = show.plot))

}


ggplot2 比较慢

有人说, 为什么不用

pdf(pdfname)
plot(...)
dev.off()


因为在salve 上绘图并不会返回到master上:)

another easy example

library(foreach)
library(doParallel)
library(parallel)

deal_data <- function(file.list){
res <-cbind(qipa[1] + 10, paste(raw.path, file.list, sep = ""))
return (res)
}

# detect core numbers
core.num <- detectCores(logical = F)
cl <- makeCluster(core.num)
registerDoParallel(cl)

x <- list.files("./rawdata/tsp-part-singleRun/")
raw.path <- "./rawdata/tsp-part-singleRun/hello/"
qipa <- c(10)
clusterExport(cl, list("raw.path", "qipa"))
#use system.time check each functions cost time
system.time(res <- parSapply(cl, x, deal_data) )
system.time(res <- parLapply(cl, x, deal_data) )
system.time(res <- foreach(x,.combine = rbind) %dopar% deal_data(x))

Experiment Result:
> system.time(res <- parSapply(cl, x, deal_data) )
user  system elapsed
0.008   0.001   0.023

> system.time(res <- parLapply(cl, x, deal_data) )
user  system elapsed
0.005   0.001   0.017

> system.time(res <- foreach(x,.combine = rbind) %dopar% deal_data(x))
user  system elapsed
9.103   1.943  12.894
可见 foreach 比较慢


后来, 我才想明白 没人写并行图片的原因

可能真的是图片太慢了

继续写代码去了…
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  parallel ggplot2 R 绘图