Für einige Arbeiten, an denen ich gerade beteiligt bin, führe ich große Datensätze mit zahlreichen Parameterkombinationen durch eine Reihe von Funktionen. Die Funktionen haben einen Wrapper (so kann ich mclapply
) für die einfache Bedienung auf einem Cluster. Ich stoße jedoch auf zwei große Herausforderungen.Wie kann ich eine Wartezeit abbrechen, wenn ein Listeneintrag fehlschlägt oder zu lange dauert?
a) Meine Parameterkombinationen sind groß (denke 20k bis 100k). Manchmal schlagen bestimmte Kombinationen fehl (z. B. ist das Überleben zu hoch und die Mortalität zu niedrig, so dass das Modell niemals als hypothetisches Szenario konvergiert). Es ist schwierig für mich, im Voraus herauszufinden, welche Kombinationen scheitern werden (das Leben wäre einfacher, wenn ich das könnte). Aber jetzt habe ich diese Art von Setup:
failsafe <- failwith(NULL, my_wrapper_function)
# This is what I run
# Note that input_variables contains a list of variables in each list item
results <- mclapply(input_variables, failsafe, mc.cores = 72)
# On my local dual core mac, I can't do this so the equivalent would be:
results <- llply(input_variables, failsafe, .progress = 'text')
Das Skelett für meine Wrapper-Funktion sieht wie folgt aus:
my_wrapper_function <- function(tlist) {
run <- tryCatch(my_model(tlist$a, tlist$b, tlist$sA, tlist$Fec, m = NULL) , error=function(e) NULL)
...
return(run)
}
Ist dies der effizienteste Ansatz? Wenn aus irgendeinem Grund eine bestimmte Kombination von Variablen das Modell abstürzt, muss ich eine NULL
zurückgeben und mit dem Rest fortfahren. Allerdings habe ich immer noch Probleme, dass dies nicht so gut gelingt.
b) Manchmal stürzt eine bestimmte Kombination von Eingängen nicht das Modell ab, aber dauert zu lange, um zu konvergieren. Ich setze die Rechenzeit auf meinem Cluster auf ein Limit (sagen wir 6 Stunden), damit ich meine Ressourcen nicht für etwas verbanne, das steckenbleibt. Wie kann ich ein Timeout einfügen, so dass, wenn ein Funktionsaufruf mehr als die x-Zeit für einen einzelnen Listeneintrag benötigt, er weitergehen sollte? Die Berechnung der Zeit ist trivial, aber eine Funktion Mid-Simulation kann nicht unterbrochen werden, um die Zeit zu überprüfen, oder?
Alle Ideen, Lösungen oder Tricks sind willkommen!
haben Sie in setTimeLimit() oder http://www.inside-r.org/node/81211? Könnte sein, was du brauchst. – frankc