【发布时间】:2013-02-16 23:09:13
【问题描述】:
我一直在为我的主管开发一个简单的函数集合,这些函数将执行一些简单的初始基因组规模统计,这很容易让我的团队快速了解可能需要更多时间的未来分析 - 因为例如 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?
谢谢。
【问题讨论】:
-
Mac 上的活动监视器怎么样?这可以向您显示正在运行的进程以及每个 CPU 的使用量。您的非并行代码运行需要多长时间?
-
嘿,我一直在做一些
foreach编码。而且我了解到您可以使用makeCluster( (coresnum-1) , outfile = "" )将每个从节点的输出重定向回主节点。请注意,如果您有 8 个从节点,您将获得 8 个输出副本,每个节点一个!我使用 (coresnum-1) 以便您考虑到主节点需要您的一个核心这一事实。出于调试目的,您可以先尝试使用 1 个辅助节点来执行此操作。 HTH。
标签: r loops foreach parallel-processing