1

我想使用雪或雪并行运行不同的任务。每个任务可以是一段完全相互独立的代码。下面是一个示例 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)

我只是想探索更灵活地运行表达式列表的可能性。就像运行回归模型列表一样,其中模型形式和数据的格式可能不一致。

4

2 回答 2

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 分钟,否则我不会打扰。

于 2013-11-09T03:46:19.627 回答
0

Try this:

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

Thanks to "async Task" user interface will not be blocked (if any).

于 2013-11-08T20:49:33.497 回答