【问题标题】:Using large hash tables in R在 R 中使用大型哈希表
【发布时间】:2020-04-12 07:53:00
【问题描述】:

我正在尝试使用包hash,据我了解,这是最常用的实现(除了直接使用环境)。

如果我尝试创建和存储大于 ~20MB 的哈希值,我会开始收到 protect(): protection stack overflow 错误。

pryr::object_size(hash::hash(1:120000, 1:120000))  # * (see end of post)
#> 21.5 MB
h <- hash::hash(1:120000, 1:120000)
#> Error: protect(): protection stack overflow

如果我运行一次h &lt;- ... 命令,错误只会出现一次。如果我运行它两次,我会在控制台中出现无限循环的错误,冻结 Rstudio 并迫使我从任务管理器重新启动它。

从其他多个 SO 问题中,我了解到这意味着我创建的指针数量超过了 R 可以保护的数量。这对我来说很有意义,因为哈希实际上只是环境(它们本身就是哈希表),所以我假设 R 需要将哈希表中的每个值作为单独的指针来跟踪。

对于protect() 错误,我看到的常见解决方案是使用rstudio.exe --max-ppsize=500000(我假设它将该选项传播到R 本身),但在这种情况下它没有帮助,错误仍然存​​在。这有点令人惊讶,因为上面示例中的哈希只有 120,000 个键/指针长,远小于给定的 500,000 个 ppsize

那么,如何在 R 中使用大哈希?我假设更改为纯环境无济于事,因为 hash 实际上只是环境的包装。


* 作为记录,上面给定的 hash::hash() 调用将创建具有非语法名称的散列,但这无关紧要:我的真实案例具有简单的字符键和整数值并显示相同的行为)

【问题讨论】:

  • 这看起来像是某个地方的错误或低效代码,但我无法重现它。 (一旦它们处于环境中,保护堆栈就不需要保存所有这些指针。可以想象,它们在插入之前都受到保护;这是一种非常低效的方法。)但是,当我运行你的代码时,我得到了没有错误。您能否举一个在干净的新会话中失败的可重现示例?
  • 更正:我在 RStudio 中确实遇到了该错误,但在独立 R 中没有。当它尝试检查对象以在环境窗格中显示时,它看起来像一个 RStudio 错误。
  • 已经在他们的错误列表中:github.com/rstudio/rstudio/issues/5546
  • @user2554330 很好,我看到你(或其他人)也已经评论了这个用例的问题。非常感谢。
  • @user2554330 随时用您在此处发布的内容写一个简短的答案。

标签: r hash hashtable


【解决方案1】:

这是 RStudio 中的一个错误,而不是 R 中的限制。当它尝试检查 h 对象以在环境窗格中显示时会发生该错误。该错误在他们的问题列表中为https://github.com/rstudio/rstudio/issues/5546

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-07
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多