【问题标题】:Nesting a Loop inside of a Parallel Foreach Loop在并行 Foreach 循环中嵌套循环
【发布时间】:2017-04-27 19:19:55
【问题描述】:

假设对于这个例子,我想以多种不同的方式划分大量文件。

DIVIDERS = c(2,3,5,10)

我有一个文件列表,我计划使用每个分隔符对每个文件进行操作。我想并行执行此操作。

我有:

foreach(x = DIVIDERS) %dopar% {
     for( y in listOfFiles ) {
           print( paste( x,  y, sep = "" ) )

这只是初步的,以确保我确实得到了每个“Y”文件的每个“X”分隔符。但是,它们都打印出 null。我想这是并行嵌套循环的问题。

有没有办法做到这一点?

【问题讨论】:

    标签: r foreach parallel-processing parallel-foreach


    【解决方案1】:

    您需要将listOfFiles 导出到每个子线程:

    foreach(x = DIVIDERS, .export=) %dopar% {
         for( y in listOfFiles ) {
               print( paste( x,  y, sep = "" ) )
    

    【讨论】:

      【解决方案2】:

      这种嵌套很好;你只是没有正确返回结果。 foreach 循环返回 NULL,因为内部 for 循环返回一个不可见的 NULL。

      试试这个:

      library(doParallel)
      cl <- makePSOCKcluster(2)
      registerDoParallel(cl)
      
      DIVIDERS <- c(2,3,5,10)
      listOfFiles <- c('file1', 'file2', 'file3')
      
      newlist <-
        foreach(x=DIVIDERS, .combine='c') %dopar% {
          sublist <- vector('list', length(listOfFiles))
          for(i in seq_along(listOfFiles)) {
            y <- listOfFiles[[i]]
            sublist[[i]] <- paste(x,  y, sep = "")
          }
          sublist
        }
      

      请注意,这使用了.combine='c',因此我们得到的是字符串列表,而不是字符串列表。

      虽然在foreach 循环内嵌套for 循环没有问题,但在这种情况下我会使用lapply

      newlist <-
        foreach(x=DIVIDERS, .combine='c') %dopar% {
          lapply(listOfFiles, function(y) paste(x, y, sep=""))
        }
      

      【讨论】:

        猜你喜欢
        • 2021-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-15
        • 1970-01-01
        相关资源
        最近更新 更多