首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并行使用大量排列:将iterpc和foreach结合起来

并行使用大量排列:将iterpc和foreach结合起来
EN

Stack Overflow用户
提问于 2015-12-10 22:05:35
回答 3查看 620关注 0票数 1

Iterpc从同一点开始每个循环。这造成了一个有趣但令人沮丧的问题,说明如下:

代码语言:javascript
复制
####Load Packages:
library("doParallel")
library("foreach")
library("iterpc")

####Define variables:    
n<-2
precision<-0.1 
support<-matrix(seq(0+precision,1-precision,by=precision), ncol=1) 
nodes<-2 #preparing for multicore.
cl<-makeCluster(nodes)

####Prep iterations
I<-iterpc(table(support),n, ordered=TRUE,replace=FALSE)
steps<-((factorial(length(support)) / factorial(length(support)-n)))/n

####Run loop to get the combined values:
registerDoParallel(cl) 
  support_n<-foreach(m=1:n,.packages="iterpc", .combine='cbind') %dopar% {
    t(getnext(I,steps))
  } #????

回传

代码语言:javascript
复制
support_n

我希望这能并行地运行每个集合,分配给每个节点的排列的一半。但是,它只做了前半部分的排列.两次。(1等于37.)如何使它返回所有排列并并行组合它们?

假设有任意数量的排列,所以内存管理和速度是不平凡的。

先前的研究:大n的所有可能排列

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-12-12 05:02:56

经过进一步的调查,我相信下面的命令实际上是并行执行的。

registerDoParallel(cl) system.time( support_n<-foreach(a=getnext(I,d=(2*steps)),.combine='cbind') %dopar% a ) support_n<-t(support_n)

谢谢你的帮助。

票数 1
EN

Stack Overflow用户

发布于 2016-01-17 09:14:51

只为任何人,谁会来这里搜索"foreach iterpc R",就像我做的那样。您的方法被标记为可接受的答案,与

代码语言:javascript
复制
result <- foreach(a=1:10)  %dopar% {
  a
} 

因为a=getnext(I,d=(2*steps))只返回第一个2*steps组合,然后foreach包将在这个组合上并行迭代。

当您有大量由iterpc返回的组合(它是为其构建的)时,您实际上不能使用这样的方法。

在这种情况下,我认为唯一能做的就是在iterpc对象上编写迭代器包装器。

代码语言:javascript
复制
# register parallel backend
library(doParallel) 
registerDoParallel(cores = 3)

#create iterpc object
library(iterpc)
combinations <- iterpc(4,2)

library(iterators) 

iterpc_iterator <- function(iterpc_object, iteration_length) {
  # one's own function of nextElement() because iterpc 
  # returns NULL on finished iteration on subsequent getnext() invocation
  # but not 'StopIteration'
  nextEl <- function() {
    if (iteration_length > 0)
      iteration_length <<- iteration_length - 1
    else
      stop('StopIteration')

    getnext(iterpc_object)
  }
  obj <- list(nextElem=nextEl)
  class(obj) <- c('irep', 'abstractiter', 'iter')
  obj
}

it <- iterpc_iterator(combinations, getlength(combinations)) 

library(foreach)
result <- foreach(i=it) %dopar% {
  i
}  
票数 2
EN

Stack Overflow用户

发布于 2016-03-31 15:23:54

您可以简单地使用包装器。您的示例中的相关行:

代码语言:javascript
复制
support_n <-foreach(a = iter_wrapper(I), .combine='cbind') %dopar% a
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34212608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档