在 R 中使用大型哈希表

Using large hash tables in R

我正在尝试使用包 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 可以保护的更多的指针。这对我来说很有意义,因为哈希实际上只是环境(它们本身只是哈希 tables),所以我假设 R 需要将哈希 table 中的每个值作为单独的指针进行跟踪。

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

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


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

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