并行计算:每个线程只加载一次包
Posted
技术标签:
【中文标题】并行计算:每个线程只加载一次包【英文标题】:Parallel computation: Loading packages in each thread only once 【发布时间】:2016-03-05 11:23:51 【问题描述】:我目前正在处理一些大型数据集,因此并行化工作流是唯一的方法。
我需要在开始时将一些包加载到每个线程一次
(即: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
。
有什么想法吗?
【问题讨论】:
@VeerendraGadekar ,我确实在上面的脚本中生成了一些随机数据。我的问题是 not 在运行并行循环。我试图避免加载包 n 次,其中 n = 我的大数据的长度。希望能澄清一点。 对 library() 的两次调用与一次调用的成本差不多(R 检查库是否已加载,如果已加载,则不执行任何操作),因此无需费力。使用您的“效果很好”的解决方案。 感谢您的评论@VeerendraGadekar。实际上,我的问题不在于 magrittr 或管道运算符,而是总体上的概念。例如,我正在使用一些包中的一些插值函数。我在这里使用 magrittr 只是为了说明。 @MartinMorgan,你是绝对正确的。您的想法的基准测试结果:初始负载:31.5 毫秒,后续负载:133 微秒。再次感谢。 【参考方案1】: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
【讨论】:
完美!不知道那个!谢谢@mkemp6!【参考方案2】:你可以试试这个:
foreach(i = randomData,.packages=c("magrittr")) %dopar%
i %>% randomFunction
【讨论】:
以上是关于并行计算:每个线程只加载一次包的主要内容,如果未能解决你的问题,请参考以下文章
python 在批量线程中运行可并行化的函数,等待每个批处理完成。这允许计算机的全部资源b