在尝试使其在并行场景 [doSNOW] 中工作时遇到了一些困难,其中涉及到共享内存 [bigmemory] 的使用。总结是我在一些 foreach 工作人员中收到以下错误“ { 中的错误:任务 1 失败 - “无法打开连接” ”。更具体地说,检查集群输出日志,它与“ '/temp/x_bigmatrix.desc': Permission denied ”有关,就像对 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 [我在 Windows 10 x64 上] 初始化 sock 集群:
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 描述符文件的问题.
我在这里的一些基础知识失败了吗?