小 ggplot 对象(1 mb)在保存时变成 7 GB .Rdata 对象

Posted

技术标签:

【中文标题】小 ggplot 对象(1 mb)在保存时变成 7 GB .Rdata 对象【英文标题】:small ggplot object (1 mb) turns into 7 gigabyte .Rdata object when saved 【发布时间】:2015-08-24 21:48:20 【问题描述】:

我有一系列 ggplot 对象,我试图将它们保存到 .rdata 文件中,以便稍后加载到 Markdown 文档中。 ggplot 对象本身非常小(几 KB)。但是,当我尝试将对象保存为 .rdata 文件以供以后检索时,生成的 .rdata 文件现在超过 8 GB。我尝试直接从 GUI 保存绘图,保存为 .rds... 保存为 .pdf 或其他图像会生成几 KB 的正常图像。

我被难住了,有其他人遇到过这个问题吗?

下面的示例工作流程,我无法为该问题提供可重现的代码,因为我无法上传制作此图所需的数据框

mcmsy<- (ggplot(data = subset(MonteCarlo, Policy == 'RBFM' & 
Year == BaselineYear), aes(MSY), alpha = 0.8) + geom_density(fill = 'steelblue2'))

object.size(mcmsy)

save(mcmsy, file = 'mcmsy_plot.rdata')

【问题讨论】:

如果没有可重复的示例,我不确定如何尝试帮助您。 ggplot 复制输入数据,尤其是在使用stat_ 时。我们真的需要看到MonteCarlo。这也不能用movies 中的stat_density 示例重现。 谢谢,我想我正在缩小问题的范围。 “mcmsy”对象是在函数内部生成的。该函数内部的环境有几个大小为几 GB 的数据帧。这些对象不以任何形式或形式参与 mcmsy。当我从环境中删除那些大对象时,生成 mcmsy,然后保存,问题就消失了。那么,ggplot 似乎正在保存生成 mcmsy 的整个环境中的数据? 看看pryr::object_size(及其文档) 【参考方案1】:

我也偶然发现了这个问题。这确实与环境有关。如果您想将绘图保存为Rdata 文件,那么您应该在生成绘图的函数内创建一个新环境,这样就不会保存完整的环境。示例:

makePlot <- function(plot.data)
  env <- new.env(parent = globalenv())
  env$subset <- plot.data

  my.plot <- with(env, 
    my.plot <- ggplot(subset, ...) 
    return(my.plot)
  )

  return(my.plot)

【讨论】:

上面的代码好像不行,请看下面: 应该修改 makePlot 函数以使用“subset”变量——而不是 plot.data 变量,它在“with”中不可用,即 my.plot

以上是关于小 ggplot 对象(1 mb)在保存时变成 7 GB .Rdata 对象的主要内容,如果未能解决你的问题,请参考以下文章

在两个数组中找到对,使得当相乘时变成一个完美的正方形

R:了解 object.size() 与内存使用的关系

C# winfrom程序可以实现按钮的鼠标悬停变色,离开恢复,按下时变成黑色并一直保持吗

https配置好后,访问时变成下载文件。

里根上台时国债只占GDP的30%

在 linux (centos 7) 中将一个大文件(例如 300GB)分割成 100MB 的小块