我一直在为我的主管研究一个简单的函数集合,这些函数将执行一些简单的初始基因组规模统计,这很容易让我的团队快速了解可能需要更多时间的未来分析——例如 RDP4 或BioC(只是为了解释为什么我没有直接去 BioConductor)。我想加快一些速度以允许更大的 contig 大小,所以我决定使用 doParallel 和 foreach 来编辑一些 for 循环以允许这样做。下面是一个简单的函数,它识别某些序列(存储为矩阵)中相同的碱基并将它们删除。
strip.invar <- function(x) {
cat("
Now removing invariant sites from DNA data matrix, this may take some time...
")
prog <- txtProgressBar(min=0, max=ncol(x), style=3)
removals<-c()
for(i in 1:ncol(x)){
setTxtProgressBar(prog, i)
if(length(unique(x[,i])) == 1) {
removals <- append(removals, i)
}
}
newDnaMatrix <- x[,-removals]
return(newDnaMatrix)
}
在阅读了 doParallel 和 foreach 的介绍之后,我尝试制作一个版本以容纳更多内核 - 在我的 Mac 上,这是 8 个 - 每个内核有两个线程的四核 - 8 个虚拟内核:
strip.invar <- function(x, coresnum=detectCores()){
cat("
Now removing invariant sites from DNA data matrix, this may take some time...
")
prog <- txtProgressBar(min=0, max=ncol(x), style=3)
removals<-c()
if(coresnum > 1) {
cl <- makeCluster(coresnum)
registerDoParallel(cl)
foreach(i=1:ncol(x)) %dopar% {
setTxtProgressBar(prog, i)
if(all(x[,i] == x[[1,i]])){
removals <- append(removals, i)
}
}
} else {
for(i in 1:ncol(x)){
setTxtProgressBar(prog, i)
if(length(unique(x[,i])) == 1) {
removals <- append(removals, i)
}
}
}
newDnaMatrix <- x[,-removals]
return(newDnaMatrix)
}
但是,如果我运行它并将核心数设置为 8,我不完全确定它是否有效 - 我看不到进度条做任何事情,但我听说打印到屏幕和涉及图形设备的东西很棘手在 R 中使用并行计算。但它似乎仍然需要一些时间,而且我的笔记本电脑变得“非常”热,所以我不确定我是否正确地做到了这一点,我在看到几个例子后尝试过(我成功运行了小插图中很好的引导示例),但我一定会遇到学习障碍。顺便说一句,我想我也会问人们的意见,对于涉及循环或应用的 R 代码瓶颈的最佳加速是什么 - 并行化它,还是 Rcpp?
谢谢。