在R中并行运行的合并列表

在R中并行运行的合并列表,r,performance,parallel-processing,R,Performance,Parallel Processing,我有一个函数,我将迭代40000次,我想使它并行,我已经用doParallel库尝试了一定的batchsize 200 输出在一个列表中,我想累加到元素级求和。输出中的每个对象都非常大,这就是为什么我必须将其分成批的原因 但是,当我运行多个批次时,运行时间变得非常慢,1个批次需要11秒的运行时间,10个批次需要160秒。有人知道我做错了什么吗 library(doParallel) myCluster <- makeCluster(3, # number of cores to use

我有一个函数,我将迭代40000次,我想使它并行,我已经用doParallel库尝试了一定的batchsize 200

输出在一个列表中,我想累加到元素级求和。输出中的每个对象都非常大,这就是为什么我必须将其分成批的原因

但是,当我运行多个批次时,运行时间变得非常慢,1个批次需要11秒的运行时间,10个批次需要160秒。有人知道我做错了什么吗

library(doParallel)
myCluster <- makeCluster(3, # number of cores to use
                         type = "PSOCK") # type of cluster
registerDoParallel(myCluster)
for(i in 1:1){
    result = foreach(j=((i-1)*batch_size+1):(i*batch_size)) %dopar% {
        some_function(input_data[j,])
    }
    result_batch_tmp <- Reduce("+",result)
    if(i==1) result_batch <- list(result_batch_tmp) 
    else result_batch <- c(result_batch,result_batch2)
    rm(result)
    rm(result_batch_tmp) 
}
stopCluster(myCluster)
库(双并行)
myCluster我会做什么:

资料
input_data我现在已经删除了大部分代码,但是我附加的代码也有同样的问题,随着运行次数的增加,速度会慢得多

step_calc_date <- function(calc_date){
  if(substr(calc_date,5,6)==12) return(floor(calc_date/10000)*10000+10101)
  else return(calc_date+100)
}


some_function <- function(input){
  calc_date<- 20180401
  t=0
  for(i in 1:1400){
    t=t+1
    calc_date=step_calc_date(calc_date)#step 1 period
    state <- t(c(0,0,0,0,0,0,0,0,0,1))
    state_prev_period = state
  }
  BE_period = rep(1,120*12+1)
  rm(input)
  return(BE_period[1])
}

step\u calc\u date也许您可以给出您的数据示例以及您在计算什么
some_函数
解释性不强。我正在计算每份合同的未来现金流,some_函数从输入_数据中的一行计算现金流。最后,我要的是总现金流,你可能不需要foreach就可以做到。欢迎光临!为了帮助你,我们需要一个。你可以很容易地生成正确形状的随机数据作为输入。minem你能解释一下或发送一个链接吗?Ralf这是我的第一篇文章,我为代码道歉,我试着编辑它,让它变得更可读谢谢。这是一个比我写的更好的解决方案,但是它给了我同样的性能,看起来R确实耗尽了内存,因为它在仅仅5次迭代之后变得非常慢。1迭代11秒,2次迭代26秒,5次迭代155秒。在foreach循环期间内存变满是否常见?请提供数据大小和函数。它在我的计算机上运行良好。我输入数据的大小是一个由40000行和23列组成的矩阵,其中一行包含输入信息。一个人的输出是1400*25矩阵。然而,我只需要所有矩阵元素的和,这就是我使用reduce的原因。我不明白我怎么能看到一个函数的大小。我想要的是你的函数,而不是它的大小。好的,我现在明白了,我原以为问题出在输入数据的大小上,但事实上问题出在输出的大小上。你应该在保持问题的同时尽量简化你的函数(即使你没有得到完全相同的输出)。当函数足够简单时,将其发布在此处,以便我们重现您的问题;如果您计划更新它,您可以删除、编辑和取消删除它,或者让它保持当前形式,直到您进行编辑
library(doParallel)
myCluster <- makeCluster(3, # number of cores to use
                         type = "PSOCK") # type of cluster
registerDoParallel(myCluster)

batchs <- 1

# Your solution
system.time({
  result_all <- foreach(i = seq_len(batchs)) %do% {
    ind.batch  <- ((i-1)*batch_size+1):(i*batch_size)
    result <- foreach(j = ind.batch) %dopar% {
      some_function(input_data[j, ])
    }
    Reduce("+", result)
  }
  result_all <- Reduce("+", result_all)
})

# My solution
system.time({
  result_all <- foreach(i = seq_len(batchs)) %do% {
    ind.batch  <- ((i-1)*batch_size+1):(i*batch_size)
    data.batch <- input_data[ind.batch, ]
    result <- foreach(j = seq_along(ind.batch)) %dopar% {
      some_function(data.batch[j, ])
    }
    Reduce("+", result)
  }
  result_all <- Reduce("+", result_all)
})

stopCluster(myCluster)
step_calc_date <- function(calc_date){
  if(substr(calc_date,5,6)==12) return(floor(calc_date/10000)*10000+10101)
  else return(calc_date+100)
}


some_function <- function(input){
  calc_date<- 20180401
  t=0
  for(i in 1:1400){
    t=t+1
    calc_date=step_calc_date(calc_date)#step 1 period
    state <- t(c(0,0,0,0,0,0,0,0,0,1))
    state_prev_period = state
  }
  BE_period = rep(1,120*12+1)
  rm(input)
  return(BE_period[1])
}