Ich habe Schwierigkeiten beim Parallelisieren von R für die Optimierung der Geschwindigkeit von Funktionsaufrufen beim Schreiben in eine Datei. Die Funktion ist einfach, aber die Dateien, die es erstellt, sind massiv und sie brauchen eine unangemessene Zeit. Ich habe Profvis verwendet, um zu visualisieren, wohin die Zeit geht, und es scheint, dass die Verdächtigen in der cat-Anweisung am Ende der Funktion und im Capture-Schritt beim Schreiben in die Ausgabedatei stehen. Ich habe unten ein vereinfachtes, kleines, reproduzierbares Beispiel-Skript eingefügt, aber die tatsächlichen Dateien sind sehr umfangreich und ich verwende sie auf einem Supercomputer-Cluster. Das parallele Ausführen des Skripts wie geschrieben gibt mir keine Geschwindigkeitssteigerung, aber ich weiß nicht, wie ich die foreach-Anweisung so strukturieren soll, dass sie jede Iteration der Funktion parallel erfasst. Wenn ich foreach in die Funktion selbst bringe, bekomme ich Probleme mit der Reihenfolge (anstelle von Header, Basisparese, Header, Basenpaaren etc. fügt sie zufällig hinzu - wie auch immer sie sich aus welchem Kern auch immer herausgelöst haben) und setzen sie in die capture.output line, scheint eigentlich nichts zu tun.Verwenden von Foreach in einer Funktionsdefinition vs. Verwenden von Foreach zum Schreiben in eine Datei
Vorgesehen Ausgabe:
ACCTTCGAA
1321:1007
GGGTCAATA
1258:1115
GGGCCTACG
1335:1642
ATCATCGCC
1547:1735
TCTCAACGA
1518:1935
TTGTGTTCT
1352:1828
CCTTTCGGC
1403:1162
ACAATTCGC
Reproduzierbare Beispielskript:
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}
Hallo @ user8173816 Wenn meine Antwort mit Ihrem Problem geholfen hat, können Sie es als Antwort akzeptieren, indem Sie auf das Häkchen auf der linken Seite klicken. Es teilt der Community mit, dass es funktioniert hat und dass Ihr Problem geschlossen wurde. – CPak