R:删除 ggplot2 对象不会释放 space?可能的内存泄漏?

R: deleting ggplot2 object does not free space? Possible memory leakage?

我注意到当试图从用户工作区中删除 ggplot2 对象时,仍然使用了大量内存!?在下面的示例中,删除使用 400MB 数据集的伪 ggplot 调用仍然会使用 400MB。这似乎尤其发生在 ggplot2 调用中使用的数据直接从文件中读取时。

这是预期的行为,还是 Hadley 在 Advanced R 中谈到的内存泄漏?以及如何有效清除内存(gc() 无济于事)?

请注意,这可能与 Memory leakage in using `ggplot` on large binned datasets 有关,但 post 从未收到答复。

谢谢!

pryr::mem_used()
path <- tempfile() 
if(!file.exists(path)){
  saveRDS(as.data.frame(matrix(1:1e08, ncol=5)), path)
}

## memory leak
pryr::mem_used()
#> 34.9 MB
p1 <- ggplot2::ggplot(readr::read_rds(path), ggplot2::aes(V1))
rm(p1)
invisible(gc())
pryr::mem_used()
#> 447 MB
ls()
#> [1] "path"

reprex package (v0.3.0)

于 2020-11-02 创建

请注意,ggplot 跟踪在包命名空间的缓存中创建的最后一个绘图。它可以通过 ggplot2::last_plot() 检索,并且像 ggsave() 这样的函数可以工作,而无需显式地将绘图传递给函数。您可以使用

清除它
ggplot2::set_last_plot(NULL)

例如

pryr::mem_used()
p1 <- ggplot2::ggplot(readr::read_rds(path), ggplot2::aes(V1))
rm(p1)
ggplot2::set_last_plot(NULL)
invisible(gc())
pryr::mem_used()

缓存会在您调用 ggplot() 或打印 ggplot 对象时设置。它只存储最近的值。