并行计算:每个线程只加载一次包

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

【讨论】:

以上是关于并行计算:每个线程只加载一次包的主要内容,如果未能解决你的问题,请参考以下文章

并行计算——OpenMP加速矩阵相乘

python 在批量线程中运行可并行化的函数,等待每个批处理完成。这允许计算机的全部资源b

Parallel ForEach For 多线程并行计算使用注意

c#双核多线程并行计算 Parallel是否最优方案

Linux并行计算多线程计算ln2(POSIX线程并行)

并行 并发