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

Antworten auf die Frage(1)

Ihre Antwort auf die Frage