使用共享内存进行并行化[bigmemory] ​​

时间:2017-05-17 17:24:17

标签: r r-bigmemory rparallel

我在尝试使其工作为并行场景[doSNOW]时遇到了一些困难,涉及使用共享内存[bigmemory]。摘要是我收到以下错误“错误{:任务1失败 - ”无法在某些foreach工作程序中打开连接“”。更具体地说,检查群集输出日志,它与“'/ temp / x_bigmatrix.desc':权限被拒绝”有关,就像对big.matrix描述符文件的并发访问存在一些问题一样

请原谅,但由于代码有点复杂,我不包括可重复的示例,而是试图解释主要工作流程的工作流程。

我有一个矩阵X,它通过以下方式转换为big.matrix:

x_bigmatrix <- as.big.matrix(x_matrix, 
                             type = "double", 
                             separated = FALSE,
                             backingfile = "x_bigmatrix.bin",
                             descriptorfile = "x_bigmatrix.desc",
                             backingpath = "./temp/")

然后,我用doSNOW初始化sock集群[我在Windows 10 x64上]:

cl <- parallel::makeCluster(N-1, outfile= "output.log")
registerDoSNOW(cl)

(showConnections()正确显示已注册的连接)

现在我必须解释我有每个工作者的主循环(foreach)然后,有一个内部循环,其中每个工作者循环遍历X中的行。主要思想是,在主语料库中,每个通过内循环顺序地为工作者提供数据块,然后,每个工作者可以存储这些观察中的一些但不是自己存储观察结果;它们存储用于后检索的行索引。为了使事情复杂化,每个工作者修改存储索引的相关R6类环境。我这样说是因为对big.matrix描述符文件的访问发生在两个不同的地方:主foreach循环和每个R6环境。 foreach主语料库如下:

workersOutput <- foreach(worker = workers, .verbose = TRUE) %dopar% {
    # In the main foreach loop I don't include the .packages argument because 
    # I do source with all the needed libraries at the beginning of the loop
    source(libs)

    # I attach the big.matrix using attach.big.matrix and the descriptor file
    x_bigmatrix <- attach.big.matrix("./temp/x_bigmatrix.desc")

    # Now the inner for loop is going to loop over the rows in X.
    # Each worker can store some of these indices for posterior retrieval
    for (i in seq(1, nrow(X)) {
        # Each R6 object associated with each worker is modified, storing indices...
        # Within these environments, there is read-only access through a getter using the same
        # procedure that above: x_bigmatrix <- attach.big.matrix("./temp/x_bigmatrix.desc")
    }
}
stopCluster(cl)

尝试访问文件中支持的big.matrix时,内部循环中出现问题。因为如果我改变这些环境中的行为来显式地存储观察而不是行索引(因此,不再能访问这些对象中的描述符文件),那么它的工作没有任何问题。另外,如果我在没有并行化[registerDoSEQ()]的情况下运行它,但是将行索引存储在对象中,也没有错误。因此,如果我在不同的R6环境中混合并行化和双重访问共享big.matrix,就会出现问题。奇怪的是,有些工作人员可以比其他工作人员运行更长的时间,甚至最后至少有一个完成了它的运行...所以这让我想到了同时访问big.matrix描述符文件的问题

我是否在某些基础知识上失败了?

1 个答案:

答案 0 :(得分:0)

如果问题是对big.matrix描述符文件的并发访问,则可以只传递描述符对象(使用describe)而不是包含该对象的描述符文件。

说明: 从描述符文件附加时,它首先创建big.matrix.descriptor对象,然后附加此对象的big.matrix。因此,如果直接使用该对象,它将被复制到您的所有群集中,您可以从中附加big.matrix