【问题标题】:How to use nested parallelisation in R when the nested loop is contained within a library?当嵌套循环包含在库中时,如何在 R 中使用嵌套并行化?
【发布时间】:2019-10-24 23:10:26
【问题描述】:

我正在使用 R 中的插入符号库并尝试同时生成多个模型。但是,由于插入符号也能够并行化,因此无法正常工作。

我知道 R 中嵌套 foreach 循环的正确格式如下:

foreach(i=inputarray) %:%
    foreach(j=secondarray) %dopar% { 
        # functions here
    }

但是,在这种情况下,我最接近的是这样的:

foreach(i=inputarray) %:% {
    trainModel(use="modelName")
}

也许这并不奇怪,因为外部迭代器没有正确传递,代码根本没有运行。改用 %dopar% 会生成有效的代码,但每次调用 trainModel 只使用一个线程,当运行较长的模型时,从任务管理器可以看到这一点。

在系统信息方面,我运行的是带有 R 3.6 的 Win 10

【问题讨论】:

    标签: r multithreading r-caret


    【解决方案1】:

    如果其他人发现自己需要这个,我发现的最佳解决方案是在第一个 foreach() {} 内创建第二个线程集群,使用 registerDoSNOW(makeCluster(x)) 为每个循环分配单独数量的线程。它还有一个额外的好处,即允许您为每个循环提供不同数量的资源以用于不相等的作业大小,这对我的应用程序很有用。当然,外部集群声明会引起一些开销线程,这些线程不会做太多事情并且对性能有一点影响,但总体而言仍然是一个不错的解决方案。

    cl <- makeCluster(n)
    registerDoParallel(cl)
    
    foreach(i=inputarray) %dopar% {
        library(doSNOW)
        registerDoSNOW(makeCluster(x))
        trainModel(...)
    }
    

    【讨论】:

      猜你喜欢
      • 2020-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-18
      • 1970-01-01
      相关资源
      最近更新 更多