当前位置:  开发笔记 > 编程语言 > 正文

并行计算:仅在每个线程中加载一次包

如何解决《并行计算:仅在每个线程中加载一次包》经验,为你挑选了1个好方法。

我目前正在处理一些大型数据集,因此并行化工作流程是唯一的方法.

我需要在开始时为每个线程加载一些包(即:for(this.thread in threads) { #load some packages }.

不幸的是,我不知道该怎么做.

下面的代码进一步说明我的问题,在这里我想使用管道操作者magrittr%dopar%:

.

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 }

.

有任何想法吗?



1> mlegge..:

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}

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有