预分配是否有助于与 R 中的 foreach 并行化?

问题描述

在使用 for 循环时,我经常遇到这样的建议,即应该预先分配一个对象并“填充它”,而不是让对象在 for 循环中“增长”。这个经验法则是否也适用于 foreach 的使用?

一个非常简单的例子,假设我想在每次蒙特卡罗绘制中采样一个长度为 3 的向量,并将每个向量存储在我的输出矩阵的每一行中。 (在我的实际代码中,我对每次绘制进行一系列操作,计算结果在另一个矩阵中出现的次数,然后将该数字保存在我的最终输出中。但我认为这与我的问题无关。 )

fn <- function(sample_size,J){
  # Preallocate output matrix
  output <- matrix(NA,nrow = sample_size,ncol = J)
  foreach (i = 1:sample_size,.combine = 'rbind') %dopar% {
    output[i,] <- runif(J)
    return(output)
    }
}

# Execute function in parallel 
system.cl = makeCluster(4)
registerDoParallel(system.cl)

fn(sample_size=100,J=3)

stopCluster(system.cl)
stopImplicitCluster()

在这种情况下,预分配对 foreach 有帮助吗?我担心的是,输出矩阵曾经被创建为一个大矩阵,然后被 foreach 覆盖(而不是填充),因此只会浪费时间和内存。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)