我最近开始在一个项目中使用R中的并行技术,并使用parallel包中的mclapply在Linux系统上运行我的程序,但是,我对parLapply
for Windows的理解遇到了障碍。
使用mclapply
,我可以设置内核数量、迭代次数,并将其传递给工作区中的现有函数。
mclapply(1:8, function(z) adder(z, 100), mc.cores=4)
我似乎不能在windows中使用parLapply
实现同样的效果,据我所知,我需要使用clusterExport()
传递所有变量,并将我想要应用的实际函数传递到参数中。
这是正确的,还是有类似于mclapply
函数的东西适用于Windows?
3条答案
按热度按时间fnatzsnv1#
mclapply
的美妙之处在于,在调用mclapply
时,所有工作进程都被创建为主进程的克隆,因此您不必担心在每个集群工作进程上复制您的环境,不幸的是,这在Windows上是不可能的。使用
parLapply
时,通常必须执行以下附加步骤:此外,完成后,最好使用
stopCluster
关闭PSOCK群集。下面是您的示例到
parLapply
的翻译:如果你的
adder
函数需要一个包,你必须在parLapply
调用它之前在每个worker上加载这个包,你可以很容易地在clusterEvalQ
中做到这一点:注意,
clusterExport
、clusterEval
和parLapply
的第一个参数NULL
表示它们应该使用通过setDefaultCluster
注册的集群对象。如果程序在许多不同的函数中使用mclapply
,这将非常有用。这样,在转换程序以使用parLapply
时,就不必将cluster对象传递给每个需要它的函数。当然,
adder
可能会调用全局环境中的其他函数,而全局环境又调用了其他函数等。在这种情况下,您还必须导出它们,并加载它们所需的任何包。还要注意的是,如果您导出的任何变量在程序运行过程中发生了更改,则必须再次导出它们,以便在集群工作线程上更新它们。同样,对于mclapply
,这是不必要的,因为无论何时调用它,它总是创建/克隆/派生工作线程,因此这是不必要的。gopyfrb32#
mclapply使用起来更简单,它使用底层操作系统的fork()功能来实现并行化。但是,由于Windows没有fork(),它将运行标准的lapply--没有并行化。
parLapply则不同,它将创建一个进程集群,这些进程甚至可以驻留在网络上的不同机器上,它们通过TCP/IP通信,以便在彼此之间传递任务和结果。
代码中的问题在于,你没有意识到parLapply的第一个参数应该是一个“cluster”对象,我能想到的在一台机器上运行parLapply的最简单的例子是:
在使用makeForkCluster创建的集群中使用parLapply在功能上等同于调用mclapply,因此它在Windows上也不起作用。:)查看文档中使用makeCluster和makePSOCKcluster创建集群的其他方法,并找出最适合您需求的方法。
72qzrwbm3#
下面是我如何使用
parLapply
进行并行计算:请记住,
makeCluster
比makePSOCKcluster
更快地创建变量的环境集群以提供给parLapply
。