在遇到R里的大量循环操作时,可以考虑多线程处理方式,提高分析速度。具体使用方法针对window与linux/mac平台有所区别。相关笔记如下

1
2
#查看系统平台 Windows/Linux
Sys.info()['sysname']

一、Linux/Mac平台

1
2
3
library(parallel)
# 检测系统的CPU数
detectCores()

1、lapply 多线程

  • mclapply()函数,关键是mc.cores参数设置
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
library(parallel)
##并行4个线程
res = mclapply(1:10, function(x){
	<code>
	<code>
	}, mc.cores = 4)
	
##并行处理不影响顺序
res = mclapply(1:1000, function(x){
	print(x)
    x2 = x*x  
    Sys.sleep(0.1)
    return(c(x, x2))
}, mc.cores = 10)
res_df = do.call(rbind, res)
head(res_df,3)
#      [,1] [,2]
# [1,]    1    1
# [2,]    2    4
# [3,]    3    9

tail(res_df,3)
#         [,1]    [,2]
# [998,]  998  996004
# [999,]  999  998001
# [1000,] 1000 1000000

2、for循环 多线程

  • 配合foreach包。可通过调整参数,设置结果返回的形式,详见相关笔记,或者该包的帮助文档。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
library(foreach)
library(doParallel)

cl=makeCluster(4)
registerDoParallel(cl) 
#专门加载所需要的分析包
clusterEvalQ(cl, library(package1))
clusterEvalQ(cl, library(package1)) 
 
res = foreach(i = 1:10) %dopar% {
	<code>
	<code>
	}
stopCluster(cl)

二、window平台

  • 个人觉得window平台的笔记本电脑可能还是不太适合多线程的使用
1
2
3
library(parallel)
# 检测系统的CPU数
detectCores()

1、lapply 多线程

  • parLapply()函数
1
2
3
4
5
6
7
8
cl <- makeCluster(4)
#专门加载所需要的分析包
clusterExport(cl, library(packages))
res=parLapply(cl, 1:10, function(x){
	<code>
	<code>
	})
stopCluster(cl) #需要显式的释放已加载的线程,比较麻烦

2、for循环的多线程调用同上