【发布时间】:2014-01-29 16:38:07
【问题描述】:
我在 R 中使用的程序的 foreach 部分遇到问题。该程序用于运行不同参数的模拟,然后将结果返回到单个列表,然后用于生成报告。
当并非所有分配的模拟运行在报告中实际可见时,就会出现问题。在所有方面,似乎只有分配的运行的一个子集实际上是
已分配。
这更有可能发生在更大的数据集(例如,模拟的时间段更长)中。
重新运行程序时发生这种情况的可能性较小,如果某些东西已经占用了 RAM,则发生这种情况的可能性更大。
系统监视器的内存使用图有时会在 100% RAM 和 100% 交换时达到峰值,然后急剧下降,之后四个子 R 会话之一消失了。
在foreach() 中使用.verbose 时,日志文件显示未在报告中显示的模拟运行将返回为NULL,而在报告中显示的模拟运行将正常返回(列表数据帧和字符变量)。
同一组参数可以产生这种效果,也可以产生完整的图形;也就是说,这组参数不是诊断性的。
foreach() 用于大约十几个参数。 .combine 为cbind,.inorder 为false,其他所有内部参数如.errorhandling 均为默认值。
这当然很烦人,因为模拟可能需要超过 20 分钟才能运行,但由于缺少数据而变得毫无用处。 有没有办法确保这些“丢弃”的会话不会被丢弃,或者如果它们被丢弃,那么这会以某种方式被捕获?
(如果重要的话,正在使用的计算机有八个处理器,因此运行四个子进程,并且注册的并行运算符来自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)
【问题讨论】:
-
我想我遇到了同样的麻烦:我的一些
foreach(i = 1:ncor) %dopar%迭代在模拟开始后不久就被任意放弃了,我正试图找出确切的时间。也许是因为内存的使用,但我不这么认为,因为模拟似乎只使用了计算机内存的一半。是否存在与计算机内存容量不同的内存阈值(在 R 中设置)?