• R语言已解决
  • R通过save.image()保存的.RData文件大小远超过空间中各个对象大小之和?

win10系统。R空间中保存了一些变量,有大有小,通过Rstudio左侧的environment看了看,所有对象的大小加起来远不足10G,可能只有七八个G,但是保存成.RData文件后,文件大小竟然超过了22G.怎么都找不出差在哪里了。请各位赐教。

之前怎么gc()都不好使。刚才gc()了一下,变成11.7G了。困惑...

但我一save.image(),这内存占用又开始飙升并占满32G的内存,半天保存不下来。到底是造了哪门子的孽...

一个不专业的猜测,会不会是R环境中的多个对象其实会共用一部分内存,比如说给数据框加新列然后存给另一个对象这种,两个数据框公共的列会占用一块内存。而在save.image的时候,所有对象分开存储,不再有公共部分节省内存了

    首先给个可复现的例子看看?另外如果凭空猜测的话,我会想猜是否有promises之类的东西在你的环境里?本身它们可能很小,但是save.image默认会把它们实现出来,那么得到的结果可能很大。例如

    delayedAssign("c", rnorm(10 ^ 7))

    这时候的变量c在环境面板里看到的只是.Primitive("call")。但是如果此时save.image的话,默认会把它实现,于是会成为一个80MB的东西。

      meeeeeeeeo 工作空间占内存也是20多G。gc()后还是20多G。昨天不知道为啥gc()后降下去了,今天又不行了。
      工作空间中所有对象加起来不到10G,用的代码是sum(sapply(ls(), function(x) object.size(get(x))))/1000000。

        lideyang 有个好奇的问题,为啥你需要保存这么大的环境空间,数据量之大第一次听说。

          Cloud2016 因为很多结果后面要用,所以就干脆保存下来了,不然还要重新运行。运行起来挺慢的。10G的工作空间很大吗?其实可以删掉一下东西变成5G左右。但删了以后占内存还是20多G。不明白这多出来的十几G到底是怎么回事。

            lideyang

            我觉得我举的这个例子符合你描述的这个情况啊。
            本身很小,save的时候evaluate了变大了,然后再次打开之后内存空间也就会按evaluate之后的了,占用变大了。

              fenguoerbian 那空间中所有的对象大小加起来也应该和工作空间占内存大小差不多吧?但是还是差了十几个G...

              lideyang 我举个例子,之前我用 Stan 跑一个 171 个参数的模型,3.2 万次迭代,花费了 3 个小时左右,我就用 saveRDS 把模型的输出结果给保存,约 40M 的样子。其实在最后模型出来前,还有调参时保留的多个模型结果,但都比这个小。 所以,我有个疑问,你的模型、数据规模有多大?规模很大的话,不一定需要把所有数据和中间结果都保存的,我觉得只把关键的保存一下就行。

              lideyang

              实际的内存占用总归不会超过物理内存的数量,但是你在计算机系统里不同的计算方式很可能会有不同的结果。比方说linux下你如果不考虑fork机制的话,那么很容易就可以让看起来的内存占用超过机器的物理内存。

              所以如果想更进一步诊断你碰到的问题的话,还是我一开始说的,你能不能给出一个能让大家稳定复现的例子?或者给出一些更具体的描述来?

                破案了各位!
                工作空间中有两个对象,是两个大的list,在rstudio的窗口中显示和用object.size()算出来都是200M左右,用lobstr::obj_size()看,好家伙二三十个G!把这俩一删就好了。感谢 fenguoerbian !感谢参与讨论的各位!
                另外把 fenguoerbian 的回答在这里贴一下,供后来人参考:

                用lobstr::obj_size或者lobstr::obj_sizes来算算看,结果可能会和object.size不一样的。

                个人建议用 saveRDS() 显式保存你要保存的具体对象,而不要用 save()save.image(),它们虽然便捷,但问题多多(一切便捷的操作,早在暗中标好了价格)。