使用共享内存[bigmemory]进行并行化
我在尝试使它成为一个并行场景[doSNOW]时遇到了一些困难,涉及到共享内存[bigmemory]的使用。总结是,我在{:task 1 failed中遇到以下错误“error-”无法在某些foreach Worker中打开连接“”。更具体地说,检查集群输出日志,它与“”/temp/x_bigmatrix.desc”相关:权限被拒绝就像并发访问big.matrix描述符文件时出现问题一样 请原谅,但是因为代码有点复杂,我不包括一个可复制的示例,而是尝试用要点来解释工作流程 我有一个矩阵X,它通过以下方式转换为big.matrix:使用共享内存[bigmemory]进行并行化,r,r-bigmemory,rparallel,R,R Bigmemory,Rparallel,我在尝试使它成为一个并行场景[doSNOW]时遇到了一些困难,涉及到共享内存[bigmemory]的使用。总结是,我在{:task 1 failed中遇到以下错误“error-”无法在某些foreach Worker中打开连接“”。更具体地说,检查集群输出日志,它与“”/temp/x_bigmatrix.desc”相关:权限被拒绝就像并发访问big.matrix描述符文件时出现问题一样 请原谅,但是因为代码有点复杂,我不包括一个可复制的示例,而是尝试用要点来解释工作流程 我有一个矩阵X,它通过以
x_bigmatrix <- as.big.matrix(x_matrix,
type = "double",
separated = FALSE,
backingfile = "x_bigmatrix.bin",
descriptorfile = "x_bigmatrix.desc",
backingpath = "./temp/")
x_bigmatrix如果问题是并发访问big.matrix描述符文件,则只需传递描述符对象(使用descripe
)而不是包含该对象的描述符文件
说明:
从描述符文件附加时,它首先创建big.matrix.descriptor
对象,然后从该对象附加big.matrix
。因此,如果直接使用该对象,它将复制到所有集群,您可以从它们附加big.matrix
。descripe
)而不是包含该对象的描述符文件
说明:
当从描述符文件附加时,它首先创建
big.matrix.descriptor
对象,然后从该对象附加big.matrix
。因此,如果直接使用该对象,它将复制到所有集群,您可以从它们附加big.matrix
。您确定可以这样并行吗?I“我建议您与软件包维护人员一起检查它的设计是否使多个进程可以同时安全地访问同一文件。让多个进程读取一个静态文件并不复杂,但如果文件有任何类型的更新(由用户或软件包更新),那么事情就变得复杂多了。显然它应该,不是吗?在我的例子中,它不需要添加R6类和环境中的所有这些东西……如果问题是并发访问big.matrix描述符文件,您就不能传递描述符对象(使用描述)而不是包含对象的描述符文件?哦,天哪,它正在工作!我仍然不完全理解为什么附加过程使用描述符(来自描述函数)工作正常,但使用完整的文件备份路径不起作用。因为最终,底层行为是相同的,不是吗?但它确实起到了作用,谢谢!:@F.Privé请将答案放在下面,以便OP可以接受答案并关闭此问题。你确定可以像那样并行吗?我建议你检查主程序包t是否设计为多个进程可以同时安全访问同一文件。让多个进程读取一个静态文件并不是那么复杂,但是如果文件有任何类型的更新(通过用户或包),那么事情就变得复杂多了。显然它应该,不是吗?在我的例子中,它不需要添加R6类和环境中的所有这些东西……如果问题是并发访问big.matrix描述符文件,您就不能传递描述符对象(使用描述)而不是包含对象的描述符文件?哦,天哪,它正在工作!我仍然不完全理解为什么附加过程使用描述符(来自描述函数)有效,但使用完整的文件备份路径无效..因为最终,基本行为是相同的,不是吗?但它确实起到了作用,谢谢!:@F.Privé请将答案放在下面,以便OP可以接受答案,并关闭此问题。
cl <- parallel::makeCluster(N-1, outfile= "output.log")
registerDoSNOW(cl)
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)