错误:C堆栈使用情况太接近限制

我试图在R中运行一些相当深的recursion代码,它不断给我这个错误:

错误:C堆栈使用情况太接近限制

我从CStack_info()输出是:

 Cstack_info() size current direction eval_depth 67108864 8120 1 2 

我的机器上有很多内存,我只是想弄清楚如何增加R的CStack。

编辑:有人问一个可重复的例子。 以下是导致问题的一些基本示例代码。 运行f(1,1)几次,你会得到错误。 请注意,我已经设置了–max-ppsize = 500000和选项(expression式= 500000),所以如果你不设置这些,你可能会得到这两个事情之一的错误。 正如你所看到的那样,recursion在这里可能会非常深入,我不知道如何使它一致地工作。 谢谢。

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

堆栈大小是一个操作系统参数,每进程可调(请参见setrlimit(2) )。 就我所知,无法从R中调整它,但可以在启动R之前使用ulimit命令从shell中调整它。 它是这样工作的:

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

8388608 = 1024 * 8192; R将打印与ulimit -s相同的值,但以字节而不是千字节表示。

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

我怀疑,无论堆栈限制如何,最终都会出现太深的recursion。 例如,在lambda = Inf的情况下,f(1)将无限期地导致立即recursion。 recursion的深度似乎是一个随机游走,有一些概率越来越深,1 – r完成当前的recursion。 当你达到堆栈限制的时候,你已经做了很多更深的步骤。 这意味着r> 1/2,而且绝大多数时候你只是继续递进。

而且,即使在无限recursion的情况下,似乎几乎可以推导出分析的或者至less是数值的解。 可以将p定义为f(1)== 1的概率,在单次迭代之后为“子”状态写出隐式expression式,并将其与p进行等价并求解。 p可以被用来作为从二项分布中抽取一次的成功机会。

这发生在我身上,原因完全不同。 我不小心创build了一个超长的string,而组合两列:

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

代替

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

让我永远找出来,因为我从来没有预料到粘贴造成的问题。

我遇到了同样的问题,收到“C堆栈使用太接近极限”的错误(尽pipe是另一个应用程序比上面user2045093所述的)。 我试过zwol的build议,但是没有成功。

令我惊奇的是,我可以通过安装最新版本的R for OS X(目前为:版本3.2.3)以及最新版本的R Studio for OS X(目前为0.99.840)来解决这个问题,因为我我正在与R Studio合作。

希望这可能对你有一些帮助。

正如马丁·摩根(Martin Morgan)所写的那样…问题在于你在recursion中太深入了。 如果recursion不完全收敛,则需要自行分解。 我希望这个代码能够工作,因为它没有经过testing。 不过至less应该在这里明确一点。

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