R 语言parallel并行画图 ggplot2 图片
2017-02-24 20:44
253 查看
很久没有写博客了
发现博客看的最多的还是自己实现简单代码的东西
但太懒了,现在都是调用包
前几天, 觉得自己程序太慢, 于是乎将其并行化
搜了几个博客, 发现例子都是一样的
不明觉厉
但内容够用
只是由于我当时的程序是生成参数和图片一起生成的(还是代码写的少,结构化的东西应该分开, 已经分开了…), 所以需要并行图片。
好了废话少说:
并行分为 master -> slave 节点
开始时master -> slave 传送数据, 然后最终收回(至于怎么收回何时收回,不懂…)
建议先看这个链接,算是入门吧:
ggplot2 比较慢
有人说, 为什么不用
因为在salve 上绘图并不会返回到master上:)
another easy example
后来, 我才想明白 没人写并行图片的原因
可能真的是图片太慢了
继续写代码去了…
发现博客看的最多的还是自己实现简单代码的东西
但太懒了,现在都是调用包
前几天, 觉得自己程序太慢, 于是乎将其并行化
搜了几个博客, 发现例子都是一样的
不明觉厉
但内容够用
只是由于我当时的程序是生成参数和图片一起生成的(还是代码写的少,结构化的东西应该分开, 已经分开了…), 所以需要并行图片。
好了废话少说:
并行分为 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 比较慢
后来, 我才想明白 没人写并行图片的原因
可能真的是图片太慢了
继续写代码去了…
相关文章推荐
- go 语言第三方库parallel的并行使用
- R语言可视化---介绍一些强大的画图和数据处理包及函数(ggplot,melt())
- R语言入门--画图(一)--ggplot2
- 第三章 并行分布式文件系统 Parallel Distributed File System
- [文摘20080429]CMMI 3级精简并行过程 SPP (Simplified Parallel Process)
- C语言画图问题
- Oracle并行服务器(OPS) Oracle Parallel Server
- 编写并行程序:多语言指南介绍
- 博客图片背景语言
- 用C语言写的ISAPI上传文件(图片)、显示图片、图片存储以及可供其它语言调用的方式、和程序源代码
- CKEditor上传图片配置PHP语言
- Hebrew语言系统下WMF图片的显示问题及解决方案。
- ORACLE 11G R2中的并行执行,dbms_parallel_execute
- 分布式、并行计算语言Erlang 学习笔记(第二部分)
- 多语言加载图片问题
- 并发(Concurrent)与并行(Parallel)
- 用socket进行图片聊天,服务器和客户端画图达到同步的效果的源代码
- 编写并行程序:多语言指南介绍
- 用Parallel_For进行并行快速排序
- 【转】 Oracle并行服务器(OPS) Oracle Parallel Server