Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
foreach()垃圾收集_R_Garbage Collection_Parallel Processing - Fatal编程技术网

foreach()垃圾收集

foreach()垃圾收集,r,garbage-collection,parallel-processing,R,Garbage Collection,Parallel Processing,我正在使用doSMP包中的嵌套foreach根据我开发的函数生成结果。通常,这个问题会使用三个嵌套循环,但由于生成的结果的大小(每个i大约80000个),当最终结果矩阵超过指定的行数时,我不得不暂停编译并将结果写入文件 i = 1 write.off = 1 while(i <= length(i.vector)){ results.frame = as.data.frame(matrix(NA, ncol = 3, nrow = 1)) while(n

我正在使用doSMP包中的嵌套foreach根据我开发的函数生成结果。通常,这个问题会使用三个嵌套循环,但由于生成的结果的大小(每个i大约80000个),当最终结果矩阵超过指定的行数时,我不得不暂停编译并将结果写入文件

i = 1
write.off = 1

while(i <= length(i.vector)){
        results.frame = as.data.frame(matrix(NA, ncol = 3, nrow = 1))

        while(nrow(results.frame) < 500000 & i <= length(i.vector)){
                results = foreach(j = 1:length(j.vector), .combine = "rbind", .inorder = TRUE) %:%
                foreach(k = 1:length(k.vector), .combine = "rbind", .inorder = TRUE) %dopar%{

                        ith.value = i.vector[i]
                        jth.value = j.vector[j]
                        kth.value = k.vector[k]
                        my.function(ith.value, jth.value, kth.value)
                }

                results.frame = rbind(results.frame, results)
                i = i + 1
        }

        results.frame = results.frame[-1,]
        write.table(results.frame, paste("part_",write.off, sep = ""))
        write.off = write.off + 1   
}
i=1
注销=1

(i<p>)你可以考虑通过写一个不同的循环来完全避免这个问题。

考虑使用
AlgDesign
中的
gen.factorial
函数,a la:

fact1 = gen.factorial(c(length(i.vector), length(j.vector), length(k.vector)), nVars = 3, center = FALSE)
foreach(ix_row = 1:nrow(fact1)) %dopar% {
  my.function(fact1[ix_row,])
}
您还可以使用内存映射文件,并使用
bigmemory
(假设您正在创建一个矩阵)预分配输出存储,这将使每个工作进程都可以自己存储其输出

这样,您的总体内存使用率将显著下降


更新1:内存问题似乎是
doSMP
的特有问题。请查看以下帖子:

我记得看到
doSMP
的另一个内存问题,无论是作为问题还是在R聊天中,但我似乎无法恢复帖子


更新2:我不知道这是否有帮助,但您可以尝试使用显式的
return()
(例如
return(my.function(ith.value,jth.value,kth.value))
)。在我的代码中,为了清晰起见,我通常使用显式的
return()

如果您知道要填充多少行(即长度(I.vector)),您可以通过设置results.frame一次来节省大量的时间和内存。每次执行rbind或其他操作都需要大量的cpu工作。请看一看更好的矢量化。另外:您确实应该使用
,我还想指出,由于外循环是
I,所以外循环是保持代码运行,直到到达最后一个循环元素(超过1.8M)。第二个循环的原因是中断计算并定期保存结果。iI也有同样的问题,有时我不得不杀死我的所有R进程,因为它们正在消耗服务器RAM(512 Gb)。谢谢你的建议,但我的问题是工作人员占用的内存(Rterm进程)耗尽。这个问题通常适用于foreach。我唯一能够让workers释放内存的方法是通过stopWorkers()。我想知道这是否是Windows上的问题&
doSMP
。我在Linux上使用doMC时没有注意到任何类似的内存泄漏。顺便说一句,
foreach
是一个单独的包,其中
doSMP
doMC
是后端。现在我想一想,其他人已经提到了doSMP的内存问题。我将修改我的回复链接到它们。感谢后续迭代器。我浏览了这些帖子,并尝试使用显式返回,但可惜没有成功。也许这应该与革命(即维护者)一起提出?如果你得到了解决方案,请发布!)