R语言作为一种开源的统计软件,其自带的计算引擎相对于其他编程语言而言较为简单,而循环操作也更加缓慢。此时就需要借助多线程运算操作来加速处理。
操作步骤
1. 安装 foreach
包和 doParallel
包
在进行多线程运算操作之前,需要先安装相应的 foreach
包和 doParallel
包。可在R环境下,使用下面命令安装:
install.packages("foreach")
install.packages("doParallel")
2. 开启多线程
library(doParallel)
cl <- makeCluster(detectCores()-2)
registerDoParallel(cl)
以上实现的是开启处理器核数-2个线程,并且将开启的线程设置为全局执行,也就是每个 R 语言的进程都可以使用这些线程。在程序运行完毕的时候,可以使用 stopCluster(cl)
命令关闭全局的线程。
3. 使用 foreach
包实现多线程循环
下面我们使用一个简单的例子,说明具体使用方法:
library(foreach)
#以求1:10个数的平方和为例子
r = foreach(i=1:10,.combine=sum,.packages = "base") %dopar% {i^2}
其中 iter
子句表示我们使用了多少个参数作为输入,这里我们使用了从 1 到 10 的整数作为输入。 .combine
选项代表用户所指定的结果整合策略,即在最后通过 sum()
函数将结果汇总。.packages
选项代表需要载入的软件包名称。
4. 多线程的 for 循环
可以通过设定初始值、终止条件及步进值,以及特殊的 .packages
参数来实现多线程的 for 循环。
library(doParallel)
cl <- makeCluster(detectCores()-2)
registerDoParallel(cl)
library(foreach)
library(iterators)
result = foreach(i=iter(1:20,by=5),.combine=c,.packages = "base") %dopar%{
ans = 0
for(j in (i):(i+4)){
ans = ans + j^2
}
return(ans)
}
stopCluster(cl)
上述代码中的 .combine
参数设置为 c
,表示使用 concatenate 从而生成向量。
示例说明
示例 1
下面给出一个例子说明如何使用 foreach 来同时计算多列数据的方差:
library(foreach)
library(doParallel)
cl<-makeCluster(3)
registerDoParallel(cl)
set.seed(52)
x<-matrix(rnorm(1e6),nrow=1000,ncol=1000)
vars<-foreach(i=1:ncol(x)) %dopar% var(x[,i])
stopCluster(cl)
此段代码中的数据 x 为一个1000*1000的数据矩阵,其中包含了1000组数据,每组数据包含了1000个随机数。
示例 2
接下来给出一个例子,说明如何使用 foreach 实现多个线程同时处理多个文件。假设我们现在有3个文件,每个文件的文件名分别为 1.txt, 2.txt 和 3.txt,下面是处理代码:
library(foreach)
library(doParallel)
a<-c("1.txt","2.txt","3.txt")
result <- foreach(i=a, .packages="base", .combine="rbind") %dopar%{
read.table(i,header=F,sep="\t")
}
stopCluster(cl)
上述程序首先声明了变量 a 为一个包含3个文件名的字符串数组,然后使用 foreach 来处理这个字符串数组,此时每个线程所使用的输入值就是这个字符串数组中的一个片段,然后再将这个片段文件中的所有行读取出来,并将它们转换成一个 DataFrame 类型。这样,在多个线程执行完之后,程序通过rbind来将这三个线程的结果整合起来。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:R语言多线程运算操作(解决R循环慢的问题) - Python技术站