为了账号安全,请及时绑定邮箱和手机立即绑定

错误:C堆栈使用率太接近极限

错误:C堆栈使用率太接近极限

慕丝7291255 2019-08-19 14:16:13
错误:C堆栈使用率太接近极限我试图在R中运行一些相当深的递归代码,它不断给我这个错误:错误:C堆栈使用率太接近极限我的输出CStack_info()是:Cstack_info()     size    current  direction eval_depth  67108864       8120          1          2我的机器上有足够的内存,我只想弄清楚如何增加R的CStack。编辑:有人要求一个可重复的例子。这是导致问题的一些基本示例代码。运行f(1,1)几次就会出现错误。请注意,我已经设置了--max-ppsize = 500000和options(表达式= 500000),所以如果你没有设置它们,你可能会得到关于这两件事之一的错误。正如你所看到的,递归可以在这里非常深入,我不知道如何让它一致地工作。谢谢。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)}
查看完整描述

3 回答

?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

堆栈大小是一个操作系统参数,可按进程调整(请参阅参考资料setrlimit(2))。据我所知,您无法在R内调整它,但您可以在启动R之前使用ulimit命令从shell调整它。它的工作原理如下:

$ ulimit -s # print default8192$ 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

要对此设置进行永久性调整,请将ulimit命令添加到shell启动文件中,以便每次登录时都执行该命令。我无法给出更具体的指示,因为它取决于您拥有的shell和内容。我也不知道如何登录图形环境(如果你没有在终端窗口中运行R,这将是相关的)。


查看完整回答
反对 回复 2019-08-19
?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

我怀疑,无论堆栈限制如何,你最终都会得到太深的递归。例如,使用lambda = Inf,f(1)会无限期地导致立即递归。递归的深度似乎是随机游走,有一些概率r更深,1-r完成当前递归。当你达到堆栈限制时,你已经做了很多“更深层次”的步骤。这意味着r> 1/2,并且绝大多数时间你只会继续递归。

而且,即使在无限递归的情况下,似乎几乎可以推导出解析或至少数值解。可以将p定义为f(1)== 1的概率,在单次迭代后写入“子”状态的隐式表达式,并将它们与p等同,并求解。然后,p可以用作从二项分布中单次绘制成功的机会。


查看完整回答
反对 回复 2019-08-19
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

这种情况发生在我身上的原因完全不同。我在组合两列时偶然创建了一个超长字符串:

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 = "_"))

让我永远想弄清楚,因为我从来没有想到粘贴会导致问题。


查看完整回答
反对 回复 2019-08-19
  • 3 回答
  • 0 关注
  • 1216 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信