问题描述
在使用 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 (将#修改为@)