是否可以让 R 调查包的`svyby` 函数 multicore= 参数在 Windows 上工作?

Ant*_*ico 4 parallel-processing fork r survey

能够在 Windows 上多线程会很棒,但也许这个问题比我想象的要难.. :(

里面survey:::svyby.default有一个块,lapply或者mclapply取决于multicore=TRUE你的操作系统。lapply无论如何,Windows 用户都会被迫进入循环,我想知道是否有任何方法可以mclapply代替……加快计算速度。

我不太了解并行处理的内部结构,但我做了一些实验,看看是否有任何 Windows 可接受的替代方案可行。首先我尝试覆盖 mclapply

mclapply <- 
    function( X , FUN , ... ){ 
        clusterApply( 
            x = X , 
            fun = FUN , 
            cl = makeCluster( detectCores() ) , ... ) 
    }
Run Code Online (Sandbox Code Playgroud)

接下来我用来fixInNamespace( svyby.default , "survey" )删除该行 if (multicore) parallel:::closeAll()

但这只是让我达到了

> svyby(~api99, ~stype, dclus1, svymean , multicore=TRUE )
Error in checkForRemoteErrors(val) :
  3 nodes produced errors; first error: object 'svymean' not found
Run Code Online (Sandbox Code Playgroud)

Ant*_*ico 5

引用 Rsurvey包的作者 Thomas Lumley 博士回应我的询问——

不可以。这种并行化方法依赖于 Windows 不支持的分叉。

有必要重写它以使用 clusterApply(),而且我很确定通信开销会消耗速度增益。通过分叉,子进程免费获得父进程数据的副本——这一切都由虚拟<->物理内存转换硬件完成——但使用集群方法,R 必须明确地将数据发送到子进程。