Как мне истечь время ожидания, когда элемент списка выходит из строя или занимает слишком много времени?

Для нескольких попыток, в которые я вовлечен в данный момент, я запускаю большие наборы данных с многочисленными комбинациями параметров через ряд функций. Функции имеют обертку (так что я могуmclapply) для удобства работы на кластере. Однако я сталкиваюсь с двумя основными проблемами.

а) Мои комбинации параметров велики (подумайте от 20 до 100 тысяч). Иногда конкретные комбинацииwill потерпеть неудачу (например, выживаемость слишком высока, а смертность слишком низкая, поэтому модель никогда не сходится в качестве гипотетического сценария). Мне трудно заранее определить, какие именно комбинации потерпят неудачу (если бы я мог это сделать, жизнь была бы проще). Но сейчас у меня есть такой тип установки:

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')

Скелет для моей функции-оболочки выглядит следующим образом:

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)
}

Это самый эффективный подход? Если по какой-то причине конкретная комбинация переменных приводит к сбою модели, мне нужно, чтобы она возвратилаNULL и продолжай с остальным. Тем не менее, у меня все еще есть проблемы, которые терпят неудачу не изящно.

б) Иногда определенная комбинация входовdoes not сбой модели, но слишком много времени, чтобы сходиться. Я установил ограничение на время вычислений в моем кластере (скажем, 6 часов), чтобы не тратить свои ресурсы на то, что застряло. Как я могу включить тайм-аут так, что если вызов функции занимает более чем x раз для одного элемента списка, он должен двигаться дальше? Вычисление затраченного времени тривиально, но симуляция функции середины не может быть прервана для проверки времени, верно?

Любые идеи, решения или хитрости приветствуются!

Ответы на вопрос(1)

Ваш ответ на вопрос