ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

R语言中的并行计算实现

R语言中的并行计算实现 文章目录parallel包foreach包实例参数介绍技巧Snowfall包snowfall的一般框架并行计算的嵌套并行计算有显性并行和隐式并行隐式并行OpenBLASIntel MKLNVIDIA cuBLASH2O(参考我的博客)等显性并行parallel主打lapply应用、foreach主打for循环、SupR、还有利用GPU的办法gpuR介绍可以参考https://cosx.org/2016/09/r-and-parallel-computinghttps://blog.csdn.net/sinat_26917383/article/details/52719232parallel是比较基础的不需要额外安装直接加载就行但是不是很稳定关于parallel包的介绍可以参考https://blog.csdn.net/weixin_41929524/article/details/81707053https://blog.csdn.net/faith_mo_blog/article/details/51646386parallel包paralle包的并行主要靠parLapply()、parSapply()、parApply()、parRapply()、parCapply()函数实现cl- makeCluster(detectCores()) all.pcg - c(httr,jsonlite,magrittr) worker.init - function(p) sapply(p,library,character.onlyTRUE) clusterCall(cl, worker.init, all.pcg) #此句用于将各个子进程的环境全部加载分配到各进程环境中 mydata2 - parLapply( cl, #进程环境 1:16, #遍历参数 GETPDF #测试代码语句 ) %% rlist::list.rbind() stopCluster(cl)cl - makePSOCKcluster(使用核的数量) clusterExport(cl,输入变量) clusterEvalQ(cl, 输入包) x - parLapply(cl,循环次数,函数) 情形1 myfun - function(x){ x^2 } 这个函数输入就只有x则并行可以如下 cl - makePSOCKcluster(2) #使用两个核 out - parLapply(cl,1:10,myfun) # 这样1:10直接输入到函数myfun里面作为x的值 情形2 myfun - function(x){ x^2 y z } 这时候函数里除了x还多出来y和z先给y和z赋值 y - 1 z - 2 通过clusterExport把赋值的变量送进函数里面 cl - makePSOCKcluster(2) clusterExport(cl,c(y,z)) #传输外部变量 out - parLapply(cl,1:10,myfun) 情形3 myfun - function(x){ 某函数(x^2 y z) } 这个情形需要用到某函数该函数包含在某包中。这时候需要通过clusterEvalQ将某包传入 cl - makePSOCKcluster(2) clusterExport(cl,c(y,z)) clusterEvalQ(cl,c(某包) x - parLapply(cl,1:10,myfun) stopCluster(cl) gc()foreach包实例# foreachlibrary(foreach)library(doParallel)#分配核心数这里获取了物理核心数cores-detectCores(logicalF)cl-makeCluster(cores)registerDoParallel(cl,corescores)system.time(#.combine是数据的合并方法如果缺省则返回一个listres-foreach(i1:20,.combinerbind,.packagesc(需要的包).exportc(需要的函数和变量))%dopar%{#主要代码区域for(jin1:100000){sij}return(s)})#关闭并行stopImplicitCluster()stopCluster(cl)参数介绍%do%: 严格按照顺序执行任务所以也就非并行计算%dopar%并行执行任务%do%时候就像sapply或lapply%dopar%就是并行启动器.combine运算之后结果的显示方式default是list“c”返回vector cbind和rbind返回矩阵并把数据整合起来..init.combine函数的第一个变量.final返回最后结果.inorderTRUE则返回和原始输入相同顺序的结果对结果的顺序要求严格的时候FALSE返回没有顺序的结果可以提高运算效率。这个参数适合于设定对结果顺序没有需求的情况。.muticombine设定.combine函数的传递参数default是FALSE表示其参数是2TRUE可以设定多个参数.maxcombine设定.combine的最大参数.errorhandling如果循环中出现错误对错误的处理方法.packages指定在%dopar%运算过程中依赖的package%do%会忽略这个选项用于并行一些机器学习算法。.export:在编译函数的时候需要预先加载一些内容进去类似parallel的clusterExport用法举例x-foreach(ii1:100,.combinec,.exportc(semimetric.pca,quadratic))%dopar%func(ii)可参考https://blog.csdn.net/u011178441/article/details/90742330技巧如果觉得在foreach()中写太多加载包不美观可以使用clusterExport()函数cl-makeCluster(cores)registerDoParallel(cl)clusterExport(cl,c(semimetric.pca,quadratic))x-foreach(ii1:100,.combinec)%dopar%func(ii)#关闭并行stopImplicitCluster()stopCluster(cl)Snowfall包另外一个比较稳定的并行包是snowfall依赖snow包和parallel包可以参考https://blog.csdn.net/weixin_41929524/article/details/81742322可以比较一下运行速度library(parallel)#用于并行计算library(snowfall)# 载入snowfall包,用于并行计算system.time(for(iin1:2250){for(jin1:100000){sij}})myfun-function(i){for(jin1:100000){sij}}system.time(# 并行初始化sfInit(parallelTRUE,cpusdetectCores(logicalF)-1)# 进行lapply的并行操作s-sfLapply(1:2250,myfun)# 结束并行返还内存等资源sfStop())snowfall的一般框架library((parallel)) library(snowfall) #初始化计算群 sfInit(parallel TRUE, cpus min(coresmax,detectCores(logical T))) sfExport(XXX)#为每个进程载入相关的函数数据 sfLibrary(XXX)#为每个进程载入相关的包 parlresult-sfLapply(1:100 fun) sfStop() #结束并行并行计算的嵌套对于第一级并行化必须使用分布式内存技术(如 snow 包中的 makeCluster())而在第二级并行化中必须使用共享内存技术(多核包mclapply())。
返回列表