【问题标题】:Using multiple cores to run latin hypercube sampling in parallel使用多核并行运行拉丁超立方体采样
【发布时间】:2012-12-21 11:22:31
【问题描述】:

我打算使用 R 中的“clhs”包从总体(a、b、c、d、... 见下文)中提取代表性样本。采样过程在我的(多核)计算机上需要很长时间,所以我想并行运行采样程序(同时使用多个 CPU 内核)。

这些是我想要从中抽取样本的一些(示例)数据框(“人口”):

a <- as.data.frame(replicate(1000, rnorm(20)))
b <- as.data.frame(replicate(1000, rnorm(20)))
c <- as.data.frame(replicate(1000, rnorm(20)))
d <- as.data.frame(replicate(1000, rnorm(20)))

我要运行的clhs代码是:

clh_a <- clhs(x=a, size=round(nrow(a)/5), iter=2000, simple=F)) # 20% of all samples should be selected
clh_b <- clhs(x=b, size=round(nrow(b)/5), iter=2000, simple=F))

等等……

并行运行此采样过程的方法是什么?或者还有其他有效的方法吗?

附录(非常感谢“zipfzapf”):

我试图使用“parLapply” - 不幸的是,最后,R 抛出一条错误消息:“长度错误(x):'x' 丢失”,老实说我不明白.. . 有什么想法吗?

我的代码:

    library("snow")
            a <- as.data.frame(replicate(1000, rnorm(20)))
            b <- as.data.frame(replicate(1000, rnorm(20)))
            c <- as.data.frame(replicate(1000, rnorm(20)))
    d <- as.data.frame(replicate(1000, rnorm(20)))
    abcd <- list(a, b, c, d)
    cl <- makeCluster(4)
    results <- parLapply(cl,
       X = abcd,
       FUN = function(i) {
         clhs(x = i, size = round(nrow(i) / 5), iter = 2000, simple = FALSE)
       },
    )

【问题讨论】:

    标签: r parallel-processing sampling


    【解决方案1】:

    这对我有用(请注意,我更改了迭代次数以使事情以合理的速度进行)。

    library(snowfall)
    sfInit(parallel = TRUE, cpus = 4, type = "SOCK")
    sfLibrary(clhs)
    
    x <- sfLapply(abcd, fun = function(x) {
                clhs(x = x, size=round(nrow(x)/5), iter = 200, simple =FALSE)
            })
    
         Length Class       Mode
    [1,] 5      cLHS_result list
    [2,] 5      cLHS_result list
    [3,] 5      cLHS_result list
    [4,] 5      cLHS_result list
    

    【讨论】:

    • 确实,您使用“sfLapply”的解决方案似乎运作良好!我刚刚观察到奇怪的 system.time 值,这可能是由于并行模式...?无论如何,非常感谢,这为我节省了很多时间!
    【解决方案2】:

    (内置)包parallel 中的函数mclapplylapply 的多核版本:

    library(parallel)
    
    # population samples
    abcd <- list(a, b, c, d)
    
    # multi-core version of 'lapply(abcd, [....])'
    results <- parallel::mclapply(
      X = abcd,
      FUN = function(elem) {
        clhs(x = elem, size = round(nrow(elem) / 5), iter = 2000, simple = FALSE))
      },
      mc.preschedule = FALSE,
      mc.cores = 4L
    )
    

    这将为您提供一个列表,其中每个元素都包含相应 clhs 调用的结果。

    请注意,参数 mc.preschedulemc.cores 是可选的。如果FUN 的每个函数调用可能需要一段时间(如您的情况),将mc.preschedule 设置为FALSE 是一个好主意。

    【讨论】:

    • 非常感谢!这个解决方案看起来确实非常优雅!不幸的是,我忘了提到我在 Win7 (64b) 上使用 R(2.15.2) - 我想这就是 R 告诉我的原因:“并行错误::mclapply(X = abcd, FUN = function(elem ) {:'mc.cores' > 1 在 Windows 上不受支持”。是否有适用于 Windows 的等效包?
    • 您可以查看this post。似乎package 'snow' 提供的功能(例如 parLapply)以与上述 Windows 设置类似的方式工作
    • @Chega 你可以使用snowfall,有点像snow
    • @Roman Luštrik - 谢谢你 - 我正在为我的原始问题添加一个附录,其中我描述了“parLapply”的问题。我也在尝试降雪——同样的问题!不知道是什么问题...
    【解决方案3】:

    使用“snow”的解决方案 - 只需添加“clusterEvalQ(cl, library(clhs))”就可以了:

    a <- as.data.frame(replicate(1000, rnorm(20)))
    b <- as.data.frame(replicate(1000, rnorm(20)))
    c <- as.data.frame(replicate(1000, rnorm(20)))
    d <- as.data.frame(replicate(1000, rnorm(20)))
    abcd <- list(a, b, c, d)
    library("snow")
    cl <- makeCluster(4)
    clusterEvalQ(cl, library(clhs))
    results <- parLapply(cl, abcd, fun = function(elem) {
        clhs(x = elem, size = round(nrow(elem) / 2), iter = 50)
      })
    stopCluster(cl)
    

    再次感谢 zipfzapf 和 Roman Luštrik!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多