跟我之前先容过的snowfall纷歧样,multicore这个包专注于做好单机多核并行这个简朴而又常用的成果。这是我用过的R里最便捷的单机多核并行东西,因为它的并行化跟向量化计较细密相连,而R又是天然的向量化平台,所以一切计较往并行计较的迁移都很顺理成章。multicore的一个突出特点是历程间共享事情区,所以不需要再为新的历程初始化事情区,大大加速了历程建设与初始化速度。
主要的几个顶层应用函数:
手册例子:mclapply对lapply的并行及计较增益
lapply是一个天然可并行的函数,mclapply可以把它的计较分派到多个核举办计较,还特别提供了几个参数:
以下是一个来自manual的例子,比拟了lapply与mclapply的效率。
> system.time(unlist(mclapply(1:32, function(x) sum(rnorm(1e7)))))
user system elapsed
75.625 2.252 12.466
> system.time(unlist(lapply(1:32, function(x) sum(rnorm(1e7)))))
user system elapsed
73.972 2.304 76.282
一般的向量化运算及pvec,mclapply
pvec的成果与mclapply雷同,但更为特化,只针对付向量化函数举办操纵,所谓向量化的函数,意指它以一个向量为输入,并获得一个沟通长度的向量作为输出,而且c(FUN(x[i]), FUN([j]))==FUN(x[c(i,j)]),所以pvec实质是把一个向量化运算支解为多个向量化运算来做。而mclapply可以对任意的FUN举办操纵,并对每一个数据应用FUN函数。因为利用了向量化运算,pvec的效率会比mclapply高不少,假如利用不妥,mclapply也许会比一般的向量化函数还慢,如下面的例子。
> dates <- sprintf(‘%04d-%02d-%02d’, as.integer(2000+rnorm(1e5)),as.integer(runif(1e5,1,12)), as.integer(runif(1e5,1,28)))> system.time(a <- as.POSIXct(dates))
user system elapsed
0.692 0.180 0.872
> system.time(b <- pvec(dates, as.POSIXct))
user system elapsed
0.620 0.956 0.382
> system.time(c <- unlist(mclapply(dates, as.POSIXct)))
user system elapsed
79.517 1.900 18.888
所以,
