抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

最近用写了个画图的脚本, 需要一次性用ggplot绘制大量的图片. 虽然在脚本内所有需要使用循环的地方都已经使用上apply了, 但依然架不住一次画几百图, 所以捣鼓了一下parellel, 将画图的部分并行执行已加快速度.

之前在用python的时候就有了解到多线程和多进程, 但是到了R这…好像没有太强调线程和进程的问题, 都是说并行计算…中文资料中能找得到的与并行计算相关的基本就是parellel以及foreach了, 当然我这里用的是parellel, 然后两种方案的异同…没研究过…

使用方法其实比较简单, 就是先注册集群, 然后把任务丢到集群上跑(以函数的形式), 然后合并结果(我这里不需要), 注销集群就行. 当然, 这里的集群并不是指集群服务器, 而是英文中就写的是’cluster’, 我也不知道怎么翻译好…随便叫一下算了. 具体的实现代码如下:

1
2
3
4
5
6
7
8
9
10
11
# 准备绘图函数
plot_process <- function (data_list, args) {
library(ggplot2)
plot <- ggplot() + geom_line()
ggsave("plot.png", plot)
}

cl <- makeCluster(core_num) # 注册
parLapply(cl, data_list, plot_process, args) # 除了第一个参数指定集群, 其他参数同lapply
stopCluster(cl) # 注销
# 由于我只是分别处理数据并绘图, 所以没有很多教程里的合并结果数据的那一步

所以其实超简单的…唯一有点麻烦的问题是, 对于每一个集群节点, 计算需要的变量, 包, 函数都得单独加载一次. 对于变量和包都好说, 变量有专门的函数进行传递, 包的话可以把载入包的语句写到plot_process里面, 但是自己编写的函数就没有直接可用的方式了…
在查了很久都没有解决方案后, 我突发奇想的把函数作为参数写到了plot_process上, 居然有用…

在写完这个脚本后, 我还看到了另外一种解决方案, 就是把这些自定义函数单独写在另一个文件里, 然后在plot_process使用source()导入, 这个应该是个更好的方案, 回头我准备试试看….

评论

留下友善的评论吧~