Erro: o uso da pilha C está muito próximo do limite

Eu estou tentando executar algum código recursivo bastante profundo em R e continua me dando este erro:

Erro: o uso da pilha C está muito próximo do limite

Minha saída de CStack_info() é:

 Cstack_info() size current direction eval_depth 67108864 8120 1 2 

Eu tenho muita memory na minha máquina, só estou tentando descobrir como posso aumentar o CStack para R.

EDIT: Alguém pediu um exemplo reproduzível. Aqui está um código de exemplo básico que causa o problema. Executando f (1,1) algumas vezes, você receberá o erro. Observe que já defini –max-ppsize = 500000 e opções (expressões = 500000), portanto, se você não definir essas opções, poderá receber um erro sobre uma dessas duas coisas. Como você pode ver, a recursion pode ser muito profunda aqui e eu não tenho ideia de como fazer isso funcionar de forma consistente. Obrigado.

 f <- function(root=1,lambda=1) { x <- c(0,1); prob <- c(1/(lambda+1),lambda/(lambda+1)); repeat { if(root == 0) { break; } else { child <- sample(x,2,replace=TRUE,prob); if(child[1] == 0 && child[2] == 0) { break; } if(child[1] == 1) { child[1] <- f(root=child[1],lambda); } if(child[2] == 1 && child[1] == 0) { child[2] <- f(root=child[2],lambda); } } if(child[1] == 0 && child[2] == 0) { break; } if(child[1] == 1 || child[2] == 1) { root <- sample(x,1,replace=TRUE,prob); } } return(root) } 

O tamanho da pilha é um parâmetro do sistema operacional, ajustável por processo (consulte setrlimit(2) ). Você não pode ajustá-lo de dentro do R até onde eu saiba, mas você pode ajustá-lo a partir do shell antes de iniciar o R, com o comando ulimit . Funciona assim:

 $ ulimit -s # print default 8192 $ R --slave -e 'Cstack_info()["size"]' size 8388608 

8388608 = 1024 * 8192; R está imprimindo o mesmo valor que ulimit -s , mas em bytes, em vez de kilobytes.

 $ ulimit -s 16384 # enlarge stack limit to 16 megs $ R --slave -e 'Cstack_info()["size"]' size 16777216 

Eu suspeito que, independentemente do limite de pilha, você vai acabar com recursões que são muito profundas. Por exemplo, com lambda = Inf, f (1) leva a uma recursion imediata, indefinidamente. A profundidade da recursion parece ser uma caminhada aleatória, com alguma probabilidade r de ir mais fundo, 1 – r de terminar a recursion atual. No momento em que você atingiu o limite de pilha, você fez um grande número de etapas “mais profundas”. Isso implica que r> 1/2 e a grande maioria do tempo que você continuará a reciclar.

Além disso, parece quase possível obter uma solução analítica ou, pelo menos, numérica, mesmo diante da recursion infinita. Pode-se definir p como a probabilidade de que f (1) == 1, escrever expressões implícitas para os estados ‘child’ após uma única iteração, e equacionar estes com p e solve. p pode então ser usado como a chance de sucesso em um único sorteio a partir de uma distribuição binomial.

Isso aconteceu comigo por um motivo completamente diferente. Eu acidentalmente criei uma string superlong enquanto combina duas colunas:

 output_table_subset = mutate(big_data_frame, combined_table = paste0(first_part, second_part, col = "_")) 

ao invés de

 output_table_subset = mutate(big_data_frame, combined_table = paste0(first_part, second_part, sep = "_")) 

Levou-me para sempre para descobrir como eu nunca esperava que a pasta tenha causado o problema.

Eu encontrei o mesmo problema de receber o erro “C stack usage is too close to the limit” (embora para outra aplicação que não a declarada pelo usuário2045093 acima). Eu tentei a proposta do zwol, mas não deu certo.

Para minha própria surpresa, eu poderia resolver o problema instalando a versão mais recente do R para OS X (atualmente: versão 3.2.3), bem como a versão mais recente do R Studio para OS X (atualmente: 0.99.840), já que Estou trabalhando com o R Studio.

Espero que isso possa ser de alguma ajuda para você também.

Como Martin Morgan escreveu … O problema é que você fica muito profundamente dentro da recursion. Se a recursion não convergir, você precisa quebrá-la por conta própria. Espero que este código funcione, porque não é testado. No entanto, pelo menos, o ponto deve estar claro aqui.

 f < - function(root=1,lambda=1,depth=1) { if(depth > 256){ return(NA) } x < - c(0,1); prob <- c(1/(lambda+1),lambda/(lambda+1)); repeat { if(root == 0) { break; } else { child <- sample(x,2,replace=TRUE,prob); if(child[1] == 0 && child[2] == 0) { break; } if(child[1] == 1) { child[1] <- f(root=child[1],lambda,depth+1); } if(child[2] == 1 && child[1] == 0) { child[2] <- f(root=child[2],lambda,depth+1); } } if(child[1] == NA | child[2] == NA){ return NA; } if(child[1] == 0 && child[2] == 0) { break; } if(child[1] == 1 || child[2] == 1) { root <- sample(x,1,replace=TRUE,prob); } } return(root) } 

Uma questão aqui pode ser que você está chamando f dentro de si

 plop < - function(a = 2){ pouet <- sample(a) plop(pouet) } plop() Erreur : évaluations trop profondément imbriquées : récursion infinie / options(expressions=) ? Erreur pendant l'emballage (wrapup) : évaluations trop profondément imbriquées : récursion infinie / options(expressions=) ?