并行计算:每个线程只加载一次包
Parallel computation: Loading packages in each thread only once
我目前正在处理一些大型数据集,因此并行化工作流程是唯一的出路。
我需要在开始时为每个线程加载一次包
(即:for(this.thread in threads) { #load some packages }
.
不幸的是,我不知道该怎么做。
以下代码进一步说明了我的问题,我试图在 %dopar%
中使用来自 magrittr
的管道运算符:
。
library(parallel)
library(doParallel)
library(foreach)
library(magrittr)
# Generate some random data and function :
# -----------------------------------------
randomData = runif(10^3)
randomFunction = function(x) {x * (2^x) }
randomData[1] %>% randomFunction #Works
# And now ... The parallel part :
# --------------------------------
myCluster = makeCluster(6)
registerDoParallel(myCluster)
# Test that the do par is up and running:
foreach(i = randomData) %dopar% { i }
# Use magrittr pipe operator:
# Error in { : task 1 failed - "could not find function "%>%""
foreach(i = randomData) %dopar% { i %>% randomFunction }
# Load the library at each loop: (ie: length(data) times !)
# Other than unnecessarily loading the library (length(data) - numberOfThreads) times,
# it works nicely
foreach(i = randomData) %dopar% { library(magrittr); i %>% randomFunction }
# Now try without re-loading:
# Tararaa - (ie: Works nicely)
foreach(i = randomData) %dopar% { i %>% randomFunction }
。
有什么想法吗?
doParallel
包从 parallel
继承了一些方便的低级函数,包括 clusterCall
,它在每个节点上执行一次函数。
我遇到了完全相同的问题并通过以下方式解决了它:
library(doParallel)
myCluster = makeCluster(6)
registerDoParallel(myCluster)
clusterCall(myCluster, function() library(magrittr))
您也可以使用参数 .packages
:
foreach(i = 1:5, .packages = "magrittr") %dopar% {i %>% runif}
你可以试试这个:
foreach(i = randomData,.packages=c("magrittr")) %dopar% {
i %>% randomFunction
}
我目前正在处理一些大型数据集,因此并行化工作流程是唯一的出路。
我需要在开始时为每个线程加载一次包
(即:for(this.thread in threads) { #load some packages }
.
不幸的是,我不知道该怎么做。
以下代码进一步说明了我的问题,我试图在 %dopar%
中使用来自 magrittr
的管道运算符:
。
library(parallel)
library(doParallel)
library(foreach)
library(magrittr)
# Generate some random data and function :
# -----------------------------------------
randomData = runif(10^3)
randomFunction = function(x) {x * (2^x) }
randomData[1] %>% randomFunction #Works
# And now ... The parallel part :
# --------------------------------
myCluster = makeCluster(6)
registerDoParallel(myCluster)
# Test that the do par is up and running:
foreach(i = randomData) %dopar% { i }
# Use magrittr pipe operator:
# Error in { : task 1 failed - "could not find function "%>%""
foreach(i = randomData) %dopar% { i %>% randomFunction }
# Load the library at each loop: (ie: length(data) times !)
# Other than unnecessarily loading the library (length(data) - numberOfThreads) times,
# it works nicely
foreach(i = randomData) %dopar% { library(magrittr); i %>% randomFunction }
# Now try without re-loading:
# Tararaa - (ie: Works nicely)
foreach(i = randomData) %dopar% { i %>% randomFunction }
。
有什么想法吗?
doParallel
包从 parallel
继承了一些方便的低级函数,包括 clusterCall
,它在每个节点上执行一次函数。
我遇到了完全相同的问题并通过以下方式解决了它:
library(doParallel)
myCluster = makeCluster(6)
registerDoParallel(myCluster)
clusterCall(myCluster, function() library(magrittr))
您也可以使用参数 .packages
:
foreach(i = 1:5, .packages = "magrittr") %dopar% {i %>% runif}
你可以试试这个:
foreach(i = randomData,.packages=c("magrittr")) %dopar% {
i %>% randomFunction
}