win10系统。R空间中保存了一些变量,有大有小,通过Rstudio左侧的environment看了看,所有对象的大小加起来远不足10G,可能只有七八个G,但是保存成.RData文件后,文件大小竟然超过了22G.怎么都找不出差在哪里了。请各位赐教。
R通过save.image()保存的.RData文件大小远超过空间中各个对象大小之和?
之前怎么gc()都不好使。刚才gc()了一下,变成11.7G了。困惑...
但我一save.image(),这内存占用又开始飙升并占满32G的内存,半天保存不下来。到底是造了哪门子的孽...
一个不专业的猜测,会不会是R环境中的多个对象其实会共用一部分内存,比如说给数据框加新列然后存给另一个对象这种,两个数据框公共的列会占用一块内存。而在save.image
的时候,所有对象分开存储,不再有公共部分节省内存了
首先给个可复现的例子看看?另外如果凭空猜测的话,我会想猜是否有promises之类的东西在你的环境里?本身它们可能很小,但是save.image
默认会把它们实现出来,那么得到的结果可能很大。例如
delayedAssign("c", rnorm(10 ^ 7))
这时候的变量c
在环境面板里看到的只是.Primitive("call")
。但是如果此时save.image
的话,默认会把它实现,于是会成为一个80MB的东西。
fenguoerbian 不太像是这个原因。因为不但保存的文件大,打开后在任务管理器中可以看到占内存也是20多G。
meeeeeeeeo 工作空间占内存也是20多G。gc()后还是20多G。昨天不知道为啥gc()后降下去了,今天又不行了。
工作空间中所有对象加起来不到10G,用的代码是sum(sapply(ls(), function(x) object.size(get(x))))/1000000。
我觉得我举的这个例子符合你描述的这个情况啊。
本身很小,save的时候evaluate了变大了,然后再次打开之后内存空间也就会按evaluate之后的了,占用变大了。
lideyang
用lobstr::obj_size
或者lobstr::obj_sizes
来算算看,结果可能会和object.size
不一样的。
fenguoerbian 那空间中所有的对象大小加起来也应该和工作空间占内存大小差不多吧?但是还是差了十几个G...
fenguoerbian 我去,算出来67G...
实际的内存占用总归不会超过物理内存的数量,但是你在计算机系统里不同的计算方式很可能会有不同的结果。比方说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()
,它们虽然便捷,但问题多多(一切便捷的操作,早在暗中标好了价格)。