我对R中的doSNOW
群集有一个基本问题。当我们在R中注册并行群集时,它会将在全局环境中分配的所有变量(数据)加载到并行群集。有什么办法,我们可以指定在并行集群中加载哪些对象?
更具体一点。请考虑以下示例。我在全球环境中有两个变量x和y。当我注册群集时,它会将x和y加载到已注册的群集。但是,我只需要并行集群中的x而不是y。
library(doSNOW)
cl <- makeCluster(2, type="SOCK")
registerDoSNOW(cl)
x <- 1:5
y <- 6:10
foreach(x=x, .combine=c) %dopar% x^2
stopCluster(cl)
由于设置并行群集需要一段时间,因此在全球环境中存在大量数据(或大数据集)时,它可以帮助缩短时间,但您并不需要全部他们是并行集群。
答案 0 :(得分:3)
注册doSNOW时,变量不会导出到worker。变量只在执行foreach循环时自动导出到worker,即使这样,它也只导出在foreach循环体中实际引用并在“local”环境中定义的变量(这不是全局环境)如果foreach循环在函数中执行,例如)。它使用这种保守的方法来避免向计算机不需要的大量对象发送。
同样重要的是要注意,自动导出的变量不会导出到worker的全局环境,即使它们是在master的全局环境中定义的。它们是在doSNOW设置的特殊环境中定义的,因此它们不会破坏您使用clusterExport
函数创建的任何全局变量,例如。
您可以使用foreach .verbose=TRUE
选项获取doSNOW自动导出的变量列表。以下是您的示例报告:
> foreach(x=x, .combine='c', .verbose=TRUE) %dopar% {
+ x ^ 2
+ }
no variables are automatically exported
如果要阻止特定变量自动导出,可以使用foreach .noexport
选项。如果您想使用clusterExport
将大型数据框架导出一次,然后在多个foreach循环中使用它,那么这可能很有用。