如何在R中设置C栈的大小?

10

我正在尝试在一个有大约三百万个观测值的数据框中使用R中tidyr包中的spread()函数。但是它返回以下错误信息:

Error : C stack usage  26498106 is too close to the limit

当我运行Cstack_info()时,它告诉我:
> Cstack_info()
      size    current  direction eval_depth 
   7969177      15272          1          2 

按照这个问题的回答建议,我尝试通过在终端窗口中运行ulimit -s 32768并从终端打开Rstudio来增加堆栈大小。然而,当我尝试这样做时,Cstack_info()的输出没有改变,并且当我运行我的代码时,我收到相同的错误消息。另一篇早期回答中提到更新R和Rstudio,但也无济于事。我在这里做错了什么?

我在mac os x 10.12.2上运行R 3.3,内存为16 GB。


你应该认真考虑如何避免传播。你很可能可以并且应该这样做。 - Roland
请不要使用rstudio标签,除非您有关于rstudio的具体问题。R和rstudio是独立的软件组件。 - lmo
谢谢@Roland,我已经改写了我的代码以避免使用展开操作符,虽然这样读起来有些笨拙。一般来说,有什么理由要避免使用展开操作符吗?因为我之前用Stata的时候会经常用到展开操作符来重塑数据并创建新变量。 - s.willis
1
R的数据框针对具有少量列但是许多行的情况进行了优化。大多数R函数都期望使用“长格式”数据框。 - Roland
1个回答

3
我遇到了类似的情况,但在我的情况下,我可以通过设置launchctl限制来增加C堆栈的大小。
在设置launchctl限制之前:
> Cstack_info()
      size    current  direction eval_depth 
   7969177      17072          1         2

$ ulimit -s
stack size              (kbytes, -s) 8192

$ sudo launchctl limit
stack       8388608        67104768 

设置 launchctl 限制:

$ cd /Library/LaunchDaemons/
$ sudo vi limit.stack.plist # create a new plist file to set new stack value

<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>limit.maxfiles</string>
    <key>ProgramArguments</key>
    <array>
      <string>launchctl</string>
      <string>limit</string>
      <string>stack</string>
      <string>67104768</string>
      <string>67104768</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>ServiceIPC</key>
    <false/>
  </dict>
</plist>

重启后:
> Cstack_info()
      size    current  direction eval_depth 
   63749529      17072          1          2

$ ulimit -s
stack size              (kbytes, -s) 65532

$ sudo launchctl limit
stack       67104768       67104768  

R版本3.5.0
macOS High Sierra 10.13.5


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接