Wie optimiere ich den folgenden Code mit verschachtelter while-Schleife? Multicore eine Option?
Ich habe eine Herausforderung mit einem Teil des Codes, dessen Ausführung sehr lange dauert, und ich frage mich, was die wichtigsten Tricks sind, um die Ausführungszeit dieses Codes zu optimieren. Ich muss zugeben, dass die Eingabe data.frame signifikant ist (140.000 Zeilen) und dass die Ausgabe data.frame ca. 220.000 Zeilen beträgt.
Ein Beispiel für den Eingabedatenrahmen:
head(extremes)
X_BusinessIDDescription min max month
ID105 2007-12-01 2008-06-01 2007-12-01
ID206 2007-12-01 2009-07-01 2007-12-01
ID204 2007-12-01 2008-02-01 2007-12-01
ID785 2008-07-01 2010-08-01 2008-07-01
ID125 2007-11-01 2008-07-01 2007-11-01
ID107 2007-11-01 2011-06-01 2007-11-01
Der Datenrahmen, der mit der Schleife erweitert wird. Der data.frame wird initiiert, um die Struktur in Kraft zu setzen.
output <- extremes[1,]
output
X_BusinessIDDescription min max month
ID105 2007-12-01 2008-06-01 2007-12-01
Andere Werte
IDcounter <- 1
IDmax <- nrow(extremes)
linecounter <- 1
Die while-Schleife möchte ich optimieren:
while (IDcounter <= IDmax){
start <- extremes$min[IDcounter]
end <- extremes$max[IDcounter] # add three months
while(start <= end){
output[linecounter,] <- extremes[IDcounter,]
output$month[linecounter] <- start
linecounter <- linecounter+1
start <- seq(start, by ="month", length=2)[2]
}
IDcounter <- IDcounter + 1
}
Für eine kleine Anzahl von Zeilen wird dieser Code ziemlich schnell ausgeführt, scheint jedoch langsamer zu werden, wenn die Ausgabe erweitert wird.
Die Ausgabe sieht ungefähr so aus:
head(output)
X_BusinessIDDescription min max month
ID105 2007-12-01 2008-06-01 2007-12-01
ID105 2007-12-01 2008-06-01 2008-01-01
ID105 2007-12-01 2008-06-01 2008-02-01
ID105 2007-12-01 2008-06-01 2008-03-01
ID105 2007-12-01 2008-06-01 2008-04-01
ID105 2007-12-01 2008-06-01 2008-05-01
Für jeden Monat im Intervall zwischen min und max in der Extremdatei wird eine Zeile erstellt.
Ich wäre auch interessiert zu erfahren, wie ich kann, dass dieser Code die mehreren Kerne der verfügbaren Rechenressourcen bereitstellen kann. OK, ich gebe zu, dass dies keine wirkliche Optimierung ist, aber es wird die Ausführungszeit reduzieren, was ebenfalls wichtig ist.
Jochem