Как установить тайм-аут, если элемент списка не работает или занимает слишком много времени?

Для нескольких проектов, в которых я сейчас участвую, я запускаю большие наборы данных с многочисленными комбинациями параметров через ряд функций. У функций есть оболочка (поэтому я могу 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 времени для одного элемента списка, он должен был двигаться дальше? Подсчет затраченного времени тривиален, но нельзя прерывать функцию во время моделирования, чтобы проверить время, верно?

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

12
задан Maiasaura 8 June 2012 в 16:57
поделиться