R:doSNOW / foreach创建列表列表

时间:2018-07-25 15:46:34

标签: r parallel-processing doparallel snow

嗨,我想使用doSNOW / foreach软件包创建一个命名列表列表。例如,最终产品将是列表对象。从向量命名的dfe说,

n=c("n1","n2","n3","n4","n5")

,以便我可以访问列表对象的列表,例如dfe[["n1"]]$a,其中a是列表中的元素。

这是我所谈论的例子。

mainStart <- Sys.time()

n=c("n1","n2","n3","n4","n5")

cores=detectCores() 
cl <- parallel::makeCluster(cores[1]-1) #not to overload your computer
registerDoSNOW(cl)

## setup progress bar 
pb <- txtProgressBar(max = 5, style = 3)
progress <- function(n) setTxtProgressBar(pb, n)
opts <- list(progress = progress)


dfe <-  foreach(id.this = n, .combine = list, .options.snow = opts) %dopar% {
    list ( a=c(1,2,3), b = c(1,2,3))
}

endTime <- Sys.time()
endTime -mainStart 


close(pb)
stopCluster(cl)

因此,如果我在foreach循环中创建的列表可以是循环后的名称和访问权限,那就太好了。这样dfe [[“” n1“]] $ a可以给我向量1,2,3。

1 个答案:

答案 0 :(得分:0)

如上所述,仅设置setNames(dfe,n)更容易,但是我认为这样做并不可行,因为某些进程可能比其他进程花费更长的时间,但是顺序似乎没有变化。例如,当我设置

if ( id.this == "n2"){
        Sys.sleep(10)
    }

订单仍然保留。所以最终代码将是这样的。

mainStart <- Sys.time()

n=c("n1","n2","n3","n4","n5")

cores=detectCores() 
cl <- parallel::makeCluster(cores[1]-1) #not to overload your computer
registerDoSNOW(cl)

## setup progress bar 
pb <- txtProgressBar(max = 4, style = 3)
progress <- function(n) setTxtProgressBar(pb, n)
opts <- list(progress = progress)


dfe <-  foreach(id.this = n, .options.snow = opts) %dopar% {
    #list(id.this = list(  a=c(1,2,3), b = c(1,2,3) ) )
    if ( id.this == "n2"){
        Sys.sleep(10)
    }
    list(  a=c(id.this,2,3), b = c(1,2,3) )
}

endTime <- Sys.time()
endTime -mainStart 


close(pb)
stopCluster(cl)

dfe=setNames(dfe, n)