微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决预分配是否有助于与 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 举报,一经查实,本站将立刻删除。