2015-12-18 8 views
3

我具有关于R. doSNOW簇一个基本的问题当我们寄存器R中并行集群,它加载在全球环境分配给平行集群的所有变量(数据)。有什么办法,我们可以指定在并行集群中加载哪些对象?指定哪些对象在doSNOW集群加载

更具体一点。考虑下面的例子。我在全球环境中有两个变量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

我不知道doSNOW,但'parLapply'和朋友需要明确导出你需要的对象(见'clusterExport')。你可以检查一下。在mac/linux上,你也可以使用forkClusters,它们直接继承所有的环境,不需要导出。 –

+0

感谢您的及时回复,但我期待,如果我们可以使用doSNOW或doParallel软件包来做到这一点。我不想从全球环境中导出所有变量。 – vikasnitk85

回答

3

注册doSNOW时,变量不会导出到工作人员。当foreach循环执行时,变量只会自动导出到工作人员,即使这样,它也只会导出在foreach循环体中实际引用并在“本地”环境中定义的变量(这不是全局环境例如,如果在函数中执行foreach循环)。它使用这种保守的方法来避免将巨大的对象发送给计算所不需要的工作人员。

同样重要的是要注意,自动汇出的变量不出口到工作人员的全球环境下,即使他们在主的全球环境中定义。例如,它们是在由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循环中使用它,这可能会很有用。