【发布时间】: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 微秒。再次感谢。
标签: r parallel-processing doparallel