ファイルへの書き込み時に関数呼び出しの速度を最適化するためにRを並列化するのが難しいです。この関数は単純ですが、作成するファイルは大量であり、無理な時間がかかります。私はprofvisを使って、時間がどこにあるのかを視覚化しています。そして、関数の終わりにはcatステートメントに、出力ファイルにはキャプチャステップでは容疑者が表示されているようです。私は以下のシンプルで小さな、再現可能なサンプルスクリプトを含んでいますが、実際のファイルは膨大で、スーパーコンピューティングクラスタ上で実行しています。 scripを並列で実行してもスピードは向上しませんが、関数の各反復を実際に並列に取り込むようにforeach文をどのように構造化すればいいか分かりません。 foreachを関数自体に入れておくと、ヘッダー、ベースペア、ヘッダー、ベースペアなどの代わりに、それらをランダムに追加しますが、順序は問題になりますが、実行中のコアから外れてしまいました。 capture.output行は、実際に何もしていないようです。対象foreachを関数定義で使用するとforeachを使用してファイルに書き込む
出力:
ACCTTCGAA
1321:1007
GGGTCAATA
1258:1115
GGGCCTACG
1335:1642
ATCATCGCC
1547:1735
TCTCAACGA
1518:1935
TTGTGTTCT
1352:1828
CCTTTCGGC
1403:1162
ACAATTCGC
再現スクリプトの例:
library(doParallel)
library(foreach)
#create cluster with desired number of cores
cl <- makeCluster(20)
# Register cluster
registerDoParallel(cl)
#create example data
bps <- replicate(10,paste(sample(size = 30, x = c("A","C","G","T"), replace = TRUE), collapse = ""))
true_false <- replicate(10,paste(sample(size = 1, x = c("T","F"), replace = TRUE), collapse = ""))
my.df<- data.frame(bps, true_false)
#create function to make unique Header
Header = function(){
header = c(sample(1000:2000, 1), ":", sample(1000:2000, 1))
paste(header, collapse="")
}
#assemble reads:
make_file <- function(df) {
bps <- NULL
fragment <- seq(from=1, to=(nrow(df)))
first.9<- seq(from=1, to=9)
for(i in 1:nrow(df)){
header <- Header()
fragment[i] <- df[i,1]
first.9 <- substring(fragment,1,9)
bps[i] <- cat(header, first.9[i], sep = "\n")
}
return(bps)
}
#regular capture
capture.output(make_file(df = my.df), file = "myfile1.txt", append = TRUE)
#foreach capture
foreach(x=(capture.output(make_file(df = my.df), file = "myfile2.txt", append = TRUE))) %dopar% {x}
こんにちは@ user8173816私の回答が問題の解決に役立つ場合は、左側のチェックマークをクリックして答えとして受け入れることを検討してください。それはコミュニティがそれが働いたこと、そしてあなたの問題が閉鎖されていることをコミュニティに知らせるものです。 – CPak