Rap*_*ter 5 parallel-processing r shared-memory snowfall
我试图更深入地研究R例程的并行化。
关于一堆“工人”过程的沟通,我有哪些选择?
AFAIU,没有“ 共享环境/共享内存 ”之类的东西,主服务器以及所有工作进程都可以访问,对吗?
到目前为止,我想到的最好的主意是使通信基于将JSON文档读写到硬盘上。这可能是个坏主意;-)我选择.json了.Rdata文件,因为JSON似乎经常用于软件间的通信,因此我认为应该使用该“标准”。
期待了解更好的选择!
仅供参考:我通常基于基本包并行和contrib包降雪的功能sfClusterApplyLB()进行并行化,主要依靠函数来完成工作
我应该说我在Windows上运行,但是非常感谢基于Linux的答案/提示!
对于进程之间的通信,一个有趣的开始是帮助页面?socketConnections和块中标记为“ ## Not run:”的代码。因此,开始一个R进程并运行
con1 <- socketConnection(port = 6011, server=TRUE)
Run Code Online (Sandbox Code Playgroud)
此过程充当服务器,在特定端口上侦听某些信息。现在开始第二个R流程并输入
con2 <- socketConnection(Sys.info()["nodename"], port = 6011)
Run Code Online (Sandbox Code Playgroud)
进程2中的con2与进程1中的con1建立了套接字连接。回到con1,写出R对象 LETTERS
writeLines(LETTERS, con1)
Run Code Online (Sandbox Code Playgroud)
并在con2上检索它们。
readLines(con2)
Run Code Online (Sandbox Code Playgroud)
因此,您无需写入磁盘就可以在进程之间进行通信。一些重要的概念在这里也是隐含的,例如,关于阻塞连接与非阻塞连接。如果端口可以在计算机所处的任何网络上访问,则它不仅限于同一台计算机上的通信。这是makePSOCKcluster并行程序包的基础,此外,进程1实际上使用system并行程序包中的命令和脚本来启动进程2。返回的对象makePSOCKcluster是可子设置的,因此您可以使用一部分集群以解决特定任务。原则上,您可以安排生成的节点彼此进行通信,而与进行生成的节点无关。
一个有趣的练习是使用包中的fork-like命令parallel(在非Windows上)执行相同的操作。帮助页面的高级版本?mcparallel,例如,
p <- mcparallel(1:10)
q <- mcparallel(1:20)
# wait for both jobs to finish and collect all results
res <- mccollect(list(p, q))
Run Code Online (Sandbox Code Playgroud)
但这是建立在较低级别的sendMaster朋友之上的(请在mcparallel和mccollect源代码上发言)。
Rmpi软件包采用类似于PSOCK示例的方法,其中管理器使用脚本生成工作程序,并使用mpi而不是套接字进行通信。但不同的方法,值得如果你有一个正常运作的MPI实现一个周末的项目,是实现一个脚本,并在不同的数据同样的计算,然后整理结果到一个单一节点,使用类似的命令mpi.comm.rank,mpi.barrier,mpi.send.Robj,和mpi.recv.Robj。
一个有趣的周末项目将使用并行包来实现一个涉及并行计算但不涉及mclapply种类的工作流程,例如,一个流程从网站中获取数据,然后将其传递给绘制漂亮图片的另一个流程。第一个过程的输入很可能是JSON,但是R中的通信可能更合适地是R数据对象。