【问题标题】:R Nested Foreach Parallelization not WorkingR嵌套的Foreach并行化不起作用
【发布时间】:2015-08-27 19:23:19
【问题描述】:

我在让一些嵌套的foreach 循环并行运行时遇到了一些麻烦。情况如下:

这个程序本质上是使用不同数量的观察和不同水平的统计显着性来执行假设检验。我有四个嵌套的 foreach 循环。 data.structures 项是执行测试的矩阵列表。我为data.structures 使用了两个不同的列表。一个列表包含 243 个矩阵(小列表),另一个包含 19,683 个(大列表)。

number.observations = c(50,100,250,500,1000)
significance.levels = c(.001,.01,.05,.1,.15)

require(foreach)
require(doParallel)

cl = makeCluster(detectCores())
registerDoParallel(cl)
results = foreach(data=data.structures,.inorder=FALSE,.combine='rbind') %:%
    foreach(iter=1:iterations,.inorder=FALSE,.combine='rbind') %:%
    foreach(number.observations=observations,.inorder=FALSE,.combine='rbind') %:%
    foreach(alpha=significance.levels,.inorder=FALSE,.combine='rbind') %dopar% {
  #SOME FUNCTIONS HERE
}

当我使用data.structures 的小矩阵列表时,我可以看到 Windows 的资源监视器中的所有内核都被充分利用(100% 的 CPU 使用率),每个内核有 6 个线程用于 8 个进程,并且作业完成为预计在更短的时间内。但是,当我更改为更大的矩阵列表时,会启动进程并且可以在资源监视器的进程部分中看到这些进程。八个进程中的每一个都显示三个线程,每个线程都没有 CPU 操作。总 CPU 使用率约为 12%。

我是 R 并行化的新手。即使我简化了问题和功能,我仍然只能让程序与小列表并行运行。根据我自己的阅读,我想知道这是否是工作负载分配的问题。我已经包含了.inorder = FALSE 选项来尝试解决这个问题,但无济于事。我相当肯定这个程序是一个很好的并行化候选程序,因为它执行相同的任务数十万次,并且循环不依赖于以前的值。

非常感谢任何帮助!

【问题讨论】:

  • 我怀疑您的内存不足,并且您的机器正在抖动。资源监视器是否告诉您使用了多少内存?
  • 感谢您的建议,@SteveWeston 我打开了资源监视器并重新运行了程序,在最初的几分钟内,内存使用峰值仅为物理内存的 21%。有没有可能在未来某个我还没有到达但系统已经受到影响的时候内存会用完?
  • 我希望主服务器上的内存使用量在循环过程中会增加,但如果您只使用 21% 的内存,那么这听起来不像是内存问题。我会考虑一下,但如果你能提供一个可重现的例子,那会有所帮助。

标签: r foreach parallel-processing


【解决方案1】:

类似的问题也发生在我的代码中。

y= foreach(a= seq(1,500,1),.combine='rbind') %:% 
    foreach(b = seq(1,10,1), .combine='rbind') %:%
    foreach(c = seq(1,20,1), .combine='rbind' ) %:% 
    foreach (d = seq(1,50,1), .combine='rbind' ) %do% {
        data.frame(a,b,c,d)
    }

一个非常简单的嵌套foreach并行循环,它可以执行,但不是并行方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-21
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多