【发布时间】: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 <- ... 命令,错误只会出现一次。如果我运行它两次,我会在控制台中出现无限循环的错误,冻结 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 随时用您在此处发布的内容写一个简短的答案。