gpt4 book ai didi

R foreach 问题(某些进程返回 NULL)

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

我遇到了 foreach 的问题我在 R 中使用的程序的一部分。该程序用于运行不同参数的模拟,然后将结果返回到单个列表,然后用于生成报告。
当并非所有分配的模拟运行实际上都在报告中可见时,就会出现问题。在所有方面,似乎只有分配运行的一个子集实际上是
分配。

这更有可能发生在更大的数据集上(例如,模拟的时间段更长)。
重新运行程序时不太可能发生这种情况,如果某些内容已经占用 RAM,则更有可能发生。
系统监视器的内存使用图有时会在 100% RAM 和 100% 交换时达到峰值,然后急剧下降,此后四个子 R session 之一消失了。
使用时 .verboseforeach() ,日志文件显示未在报告中显示的模拟运行返回为 NULL ,而那些确实显示在报告中的将正常返回(数据框和字符变量的列表)。
同一套参数可以产生这种效果或者可以产生一个完整的图形;也就是说,这组参数不是诊断性的。
foreach()用于大约十几个参数。 .combinecbind , .inorder为假,所有其他内部参数如 .errorhandling是默认的。

这当然很令人恼火,因为模拟可能需要超过 20 分钟才能运行,但由于数据丢失,结果却毫无用处。
有没有办法确保这些“删除”的 session 不被删除,或者如果它们被删除,那么这会以某种方式被捕获?

(如果重要的话,正在使用的计算机有八个处理器,因此运行四个子进程,并且注册的并行运算符来自 DoMC 包)

代码结构大致如下:

test.results <- foreach(parameter.one = parameter.one.space, .combine=cbind) %:%
foreach(parameter.two = parameter.two.space, .combine=cbind) %:%
...
foreach(parameter.last = parameter.last.space, .combine=cbind, .inorder=FALSE) %dopar%
{

run.result <- simulationRun(parameter.one,
parameter.two,
...
parameter.last)

list(list(parameters=list(parameter.one,
parameter.two,
...
parameter.last),
runResult <- run.result))
}

return(test.results)

最佳答案

我猜你在 Linux 上运行,因为从你的描述来看,听起来子 R session 正在被 Linux 的“内存不足杀手”杀死。巧合的是,我最近在做 same basic problem其中 mclapply 被直接使用。

doMC 包使用 mclapply 函数并行执行 foreach 循环,不幸的是,当工作进程意外终止时,mclapply 不会发出错误信号。相反,mclapply 会为分配给该 worker 的所有任务返回 NULL。我认为在 mclapply 中没有任何选项可以改变这种行为。

我能想到的唯一解决方法是:

  • 使用 foreach 后端,例如 doParallel 或 doSNOW 而不是 doMC。
  • 将结果列表中的 NULL 视为错误并使用较少的工作人员重新运行。

  • 如果使用 doParallel,请确保创建并注册了一个集群对象,否则 Linux 系统上将使用 mclapply。使用 doParallel 和 doSNOW,如果一个 worker 异常死亡,master 会得到一个错误,从死掉的 worker 获取任务结果:
    Error in unserialize(node$con) : error reading from connection

    在这种情况下,并行后端将捕获错误并使用指定的错误处理。

    请记住,使用 doParallel 或 doSNOW 可能比 doMC 使用更多内存,因此您可能必须为它们指定更少的工作程序以避免内存不足。

    关于R foreach 问题(某些进程返回 NULL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21048839/

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