我在尝试使其工作为并行场景[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描述符文件的问题
我是否在某些基础知识上失败了?
答案 0 :(得分:0)
如果问题是对big.matrix描述符文件的并发访问,则可以只传递描述符对象(使用describe
)而不是包含该对象的描述符文件。
说明:
从描述符文件附加时,它首先创建big.matrix.descriptor
对象,然后附加此对象的big.matrix
。因此,如果直接使用该对象,它将被复制到您的所有群集中,您可以从中附加big.matrix
。