指定要在doSNOW群集中加载的对象

时间:2015-12-18 03:03:21

标签: r performance parallel-processing

我对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)

由于设置并行群集需要一段时间,因此在全球环境中存在大量数据(或大数据集)时,它可以帮助缩短时间,但您并不需要全部他们是并行集群。

1 个答案:

答案 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循环中使用它,那么这可能很有用。