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