Для нескольких проектов, в которых я сейчас участвую, я запускаю большие наборы данных с многочисленными комбинациями параметров через ряд функций. У функций есть оболочка (поэтому я могу mclapply
) для простоты работы в кластере. Однако я столкнулся с двумя серьезными проблемами.
а) У меня большие комбинации параметров (думаю, от 20 до 100 тысяч). Иногда определенные комбинации не срабатывают (например, выживаемость слишком высока, а смертность слишком низка, поэтому модель никогда не сходится как гипотетический сценарий). Мне трудно заранее предугадать, какие именно комбинации не сработают (жизнь была бы проще, если бы я мог это делать). Но пока у меня такая установка:
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
и продолжила работу с остальными. Тем не менее, у меня все еще есть проблемы, что это терпит неудачу менее чем изящно.
b) Иногда определенная комбинация входных данных не приводитк сбою модели, но для сходимости требуется слишком много времени. Я установил ограничение на время вычислений в моем кластере (скажем, 6 часов), чтобы не тратить ресурсы на то, что застряло.Как я могу включить тайм-аут, чтобы, если вызов функции занимает более x времени для одного элемента списка, он должен был двигаться дальше? Подсчет затраченного времени тривиален, но нельзя прерывать функцию во время моделирования, чтобы проверить время, верно?
Приветствуются любые идеи, решения и хитрости!