Como faço o tempo de lapply quando um item da lista falha ou demora muito?

Por vários esforços em que estou envolvido no momento, estou executando grandes conjuntos de dados com várias combinações de parâmetros através de uma série de funções. As funções têm um wrapper (então eu possomclapply) para facilitar a operação em um cluster. No entanto, me deparo com dois grandes desafios.

a) Minhas combinações de parâmetros são grandes (pense em 20k a 100k). Às vezes combinações particularesvai falha (por exemplo, a sobrevivência é muito alta e a mortalidade é muito baixa, de modo que o modelo nunca converge como um cenário hipotético). É difícil para mim saber com antecedência quais combinações vão falhar (a vida seria mais fácil se eu pudesse fazer isso). Mas por enquanto eu tenho esse tipo de configuração:

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

O esqueleto da minha função de wrapper é assim:

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

Esta é a abordagem mais eficiente? Se por algum motivo uma combinação particular de variáveis ​​trava o modelo, eu preciso que ele retorne umNULL e continue com o resto. No entanto, ainda tenho problemas que isso falha menos do que graciosamente.

b) Às vezes, uma certa combinação de insumosnão trave o modelo, mas demora muito para convergir. Eu estabeleço um limite no tempo de computação no meu cluster (digamos, 6 horas) para que eu não perca meus recursos em algo que está preso. Como posso incluir um tempo limite de forma que, se uma chamada de função levar mais de x tempo em um único item da lista, ela deve continuar? Calcular o tempo gasto é trivial, mas uma função no meio da simulação não pode ser interrompida para verificar a hora, certo?

Quaisquer ideias, soluções ou truques são apreciados!

questionAnswers(1)

yourAnswerToTheQuestion