私はスーパーバイザー向けに単純な初期ゲノム スケール統計を行う関数の単純なコレクションに取り組んできました。これは、より多くの時間を費やす可能性のある将来の分析についてチームに迅速な指示を与えるために簡単に実行できます。たとえば、RDP4 またはBioC (BioConductor に直行しなかった理由を説明するため)。コンティグのサイズを大きくできるようにいくつかの処理を高速化したいので、doParallel と foreach を使用して一部の for ループを編集し、これを可能にすることにしました。以下は、いくつかのシーケンス (行列として格納されている) 内の同一の塩基を識別し、それらを削除する単純な関数の 1 つです。
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 - コアごとに 2 つのスレッドを持つクアッド コア - 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 を使用しますか?
ありがとう。