如何为多个独立任务运行并行计算

时间:2013-11-08 20:24:05

标签: r foreach snow

我想使用雪或雪并行执行不同的任务。每个任务可以是一段彼此完全独立的代码。以下是3个独立任务的示例

#### # task 1: simply assign a value
a<-1:100;
#### # task 2: run a regression model
f1<-lm(b~c); 
#### # task 3: subsetting a data
d<-subset(d, ACCT_ID>100);

我的解决方案是:

My.Tasks <-function(id,x,y) {
if(id==1){a<-1:100;return(a)}
if(id==2){f1<-lm(b~c);return(f1)
if(id==3){d<-subset(d, ACCT_ID>100);return(d)}
}
cl <- makeCluster(3,type="SOCK")
registerDoSNOW(cl)
system.time(test<-foreach(i=1:3) %dopar% {My.Tasks(i)})
stopCluster(cl)

我只是想探索运行表达式列表的更多灵活性的可能性。比如运行一个回归模型列表,其中模型形式和数据可能不会一致地形成。

2 个答案:

答案 0 :(得分:4)

与snow或doSNOW并行执行不相关的R表达式有点尴尬,但您可以通过使用quote函数创建未评估表达式列表来实现。然后,您可以通过eval函数在集群工作者上评估这些表达式。以下是使用foreach和doSNOW的示例:

library(doSNOW)
cl <- makeSOCKcluster(3)
registerDoSNOW(cl)
d <- data.frame(ACCT_ID=1:110, x=rnorm(110))
c <- 1:10
b <- 3*c + 13
x <- list(quote(1:100), quote(lm(b~c)), quote(subset(d, ACCT_ID > 100)))
r <- foreach(y=x, .export=c('b', 'c', 'd')) %dopar% {
  eval(y)
}
a <- r[[1]]
f1 <- r[[2]]
d <- r[[3]]

请注意,在任务表达式中包含赋值没有多大意义。您可以并行计算表达式,并将结果值返回到列表中,该列表将示例分配给变量r,然后分配给所需的变量。

另请注意,这个简单的示例不需要足够的时间来保证并行执行。除非个别任务花了至少10秒钟并且整个计算至少花了5分钟,否则我不会打扰。

答案 1 :(得分:0)

试试这个:

private async Task ParallelComputation()
{
    Task[] taskArray = new Task[]
    {
       Task.Run(() =>
       {
           PlaceSomeCodeInComputationMethod1();
       }),
       Task.Run(() =>
       {
           PlaceSomeCodeInComputationMethod2();
       })
    };
    await Task.WhenAll(taskArray);
}

由于“异步任务”,用户界面不会被阻止(如果有的话)。