做数据分析时经常会用到并行的方式来处理。大家应该都知道并行能够充分利用计算资源来降低计算需要的时间,尤其在处理较大的数据时效果更佳明显。所以R中也提供了多进程并行的包如doParallel、parallel。用法我这里就不介绍了,因为我也不怎么熟悉,有空可以学习一下。这里主要跟大家解释一下,我使用时遇到的问题,以及如何解决这个问题的。
首先来看一下我遇到的问题,如下截图:
看到这个报错后,我也不知道原因,就网上搜索了一番,网上给出的说法是多进程任务时,有些节点找不到 “doParallel”包的位置。回头看一下我使用的脚本内容,发现还真有可能是这个原因。
我使用的脚本内容并行段的代码,主要的功能就是将bam文件按染色体分隔成小的bam文件,然后做一些统计,如下所示:
suppressMessages(library(doParallel))
foreach(i=rownames(temp_chromosome_count)) %dopar% {
if (Load_samtools_module) {
Sys.setenv(PATH = paste("/opt/ohpc/pub/libs/samtools/1.4/bin/", Sys.getenv("PATH"), sep = ":"))
}
temp_export_bam_command = paste("samtools view -b",temp_sorted_bam,i,">",paste(k,"Viral_BAM_files/",i,".bam ",sep = ""))
temp_export_bam_command = paste("samtools view -b ",temp_sorted_bam," \'",i,"\'"," > \'",k,"Viral_BAM_files/",i,".bam\'",sep = "")
system(temp_export_bam_command)
cat(paste(rownames(temp_chromosome_count),"\n"))
}
所以我就按照网上的思路修改了代码,加了几句代码,内容如下:
suppressMessages(library(doParallel))
suppressMessages(library(parallel))
cl <- makeCluster(8)
registerDoParallel(cl)
clusterEvalQ(cl, .libPaths("/home/chenyl/software/rlib/r-3.6.1_lib"))
foreach(i=rownames(temp_chromosome_count)) %dopar% {
if (Load_samtools_module) {
Sys.setenv(PATH = paste("/opt/ohpc/pub/libs/samtools/1.4/bin/", Sys.getenv("PATH"), sep = ":"))
}
temp_export_bam_command = paste("samtools view -b",temp_sorted_bam,i,">",paste(k,"Viral_BAM_files/",i,".bam ",sep = ""))
temp_export_bam_command = paste("samtools view -b ",temp_sorted_bam," \'",i,"\'"," > \'",k,"Viral_BAM_files/",i,".bam\'",sep = "")
system(temp_export_bam_command)
cat(paste(rownames(temp_chromosome_count),"\n"))
}
#循环的中间代码省略
....
}
#循环结束后结束集群的调用
stopCluster(cl)
重要的是 clusterEvalQ(cl, .libPaths("/home/chenyl/software/rlib/r-3.6.1_lib"))
是这句代码,有了这句代码,服务器在并行任务时,每一个节点的R都会加载这个库路径(/home/chenyl/software/rlib/r-3.6.1_lib)到R环境中,这样就能找到安装在该路径下的 'doParallel'包了。
最后
emm,今天就分享到这里,如果你也遇到同样的问题,希望这个帖子可以对你有所帮助。
网友评论