У меня возникают трудности с распараллеливанием R для оптимизации скорости вызовов функций при записи в файл. Функция проста, но файлы, которые она создает, огромны и занимают неоправданно много времени. Я использовал profvis, чтобы визуализировать, куда уходит время, и кажется, что подозреваемые находятся в операторе cat в конце функции и на этапе захвата при записи в выходной файл. Я включил упрощенный, небольшой, воспроизводимый пример сценария ниже, но на самом деле файлы огромны, и я запускаю их на суперкомпьютерном кластере. Запуск скрипта параллельно, как написано, не дает мне никакого увеличения скорости, но я не понимаю, как структурировать оператор foreach, чтобы он фактически захватывал каждую итерацию функции параллельно. Помещение foreach в саму функцию вызывает у меня проблемы с порядком (вместо заголовка, базовых пар, заголовков, базовых пар и т. д., они добавляются случайным образом, однако они оказались оторванными от того ядра, на котором они работали) и помещением его в Capture.output, похоже, ничего не делает.
Предполагаемый результат:
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}