Wie lege ich eine Zeitüberschreitung fest, wenn ein Listeneintrag fehlschlägt oder zu lange dauert?

Für einige Bemühungen, an denen ich im Moment beteiligt bin, führe ich große Datensätze mit zahlreichen Parameterkombinationen über eine Reihe von Funktionen aus. Die Funktionen haben einen Wrapper (also kann ichmclapply) für eine einfache Bedienung an einem Cluster. Ich stehe jedoch vor zwei großen Herausforderungen.

a) Meine Parameterkombinationen sind groß (denke an 20k bis 100k). Manchmal bestimmte Kombinationenwerden scheitern (z. B. ist das Überleben zu hoch und die Mortalität zu niedrig, sodass das Modell niemals als hypothetisches Szenario konvergiert). Es fällt mir schwer, vorher genau 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 Grundgerüst für meine Wrapper-Funktion sieht folgendermaßen 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 das der effizienteste Ansatz? Wenn aus irgendeinem Grund eine bestimmte Kombination von Variablen das Modell zum Absturz bringt, muss es a zurückgebenNULL und mach weiter mit dem Rest. Ich habe jedoch immer noch Probleme, die weniger als anmutig scheitern.

b) Manchmal eine bestimmte Kombination von Eingabennicht Das Modell stürzt ab, die Konvergenz dauert jedoch zu lange. Ich habe ein Limit für die Rechenzeit in meinem Cluster festgelegt (z. B. 6 Stunden), damit ich meine Ressourcen nicht für etwas verschwende, das feststeckt. Wie kann ich eine Zeitüberschreitung einfügen, sodass ein Funktionsaufruf, der mehr als x Mal für einen einzelnen Listeneintrag benötigt, fortgesetzt werden sollte? Die Berechnung der aufgewendeten Zeit ist trivial, aber eine Funktion für die Simulation kann nicht unterbrochen werden, um die Zeit zu überprüfen, oder?

Irgendwelche Ideen, Lösungen oder Tricks werden geschätzt!

Antworten auf die Frage(1)

Ihre Antwort auf die Frage