R嵌套的Foreach并行化不起作用

标签 r foreach parallel-processing

我在获取一些嵌套时遇到了一些麻烦 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尝试解决此问题的选项无济于事。我相当肯定这个程序是并行化的一个很好的候选者,因为它执行相同的任务数十万次并且循环不依赖于以前的值。

非常感谢任何帮助!

最佳答案

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

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并行循环,它可以被执行,但只是不能以并行方式执行。

关于R嵌套的Foreach并行化不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30791959/

相关文章:

r - 如何使用 R 跳过我要导入的数据文件中的注释行

r - 消除 while 循环

PowerShell ForEach $file in $Files 中的每个 $file

arrays - 速度 foreach 循环 - 迭代数组被更新而不用在分配中

Java设置多线程处理

r - 在 rfImpute 之后获得预测

r - ggplot2:为条形图的构面布局中的行指定不同的比例

php - 父子关系树所需的递归函数?

multithreading - Haskell 中的半显式并行性

java - 在将 java 转换的 List 迭代为不可变时使用 scala 并行性