gpt4 book ai didi

r - foreach() 垃圾收集

转载 作者:行者123 更新时间:2023-12-04 16:12:37 27 4
gpt4 key购买 nike

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

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 = 4 时,他们每个人都吃掉了大约 6GB 的内存。

我已经尝试将 gc() 直接插入到 foreach 循环以及底层函数中,并且我还尝试将函数及其结果分配给我可以定期清除的命名环境。这些方法都没有奏效。

我觉得 foreach 的 initEnvir 和 finalEnvir 参数可能会提供一个解决方案,但文档和示例并没有真正说明这一点。

我在运行 Windows Server 2008 的 VM 上运行此代码。

最佳答案

您可以考虑通过编写不同的循环来完全避免这个问题。

考虑使用 gen.factorial函数在 AlgDesign ,啦啦:

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 的特有问题。 .查看以下帖子:
  • Answer by Revo engineer discusses some memory & process issues
  • Joris Meys reports that doSMP crashes his R instances frequently

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

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

    关于r - foreach() 垃圾收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7996607/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com