lideyang win10系统。R空间中保存了一些变量,有大有小,通过Rstudio左侧的environment看了看,所有对象的大小加起来远不足10G,可能只有七八个G,但是保存成.RData文件后,文件大小竟然超过了22G.怎么都找不出差在哪里了。请各位赐教。
meeeeeeeeo 一个不专业的猜测,会不会是R环境中的多个对象其实会共用一部分内存,比如说给数据框加新列然后存给另一个对象这种,两个数据框公共的列会占用一块内存。而在save.image的时候,所有对象分开存储,不再有公共部分节省内存了
lideyang meeeeeeeeo 工作空间占内存也是20多G。gc()后还是20多G。昨天不知道为啥gc()后降下去了,今天又不行了。 工作空间中所有对象加起来不到10G,用的代码是sum(sapply(ls(), function(x) object.size(get(x))))/1000000。
fenguoerbian 首先给个可复现的例子看看?另外如果凭空猜测的话,我会想猜是否有promises之类的东西在你的环境里?本身它们可能很小,但是save.image默认会把它们实现出来,那么得到的结果可能很大。例如 delayedAssign("c", rnorm(10 ^ 7)) 这时候的变量c在环境面板里看到的只是.Primitive("call")。但是如果此时save.image的话,默认会把它实现,于是会成为一个80MB的东西。
fenguoerbian lideyang 我觉得我举的这个例子符合你描述的这个情况啊。 本身很小,save的时候evaluate了变大了,然后再次打开之后内存空间也就会按evaluate之后的了,占用变大了。
lideyang Cloud2016 因为很多结果后面要用,所以就干脆保存下来了,不然还要重新运行。运行起来挺慢的。10G的工作空间很大吗?其实可以删掉一下东西变成5G左右。但删了以后占内存还是20多G。不明白这多出来的十几G到底是怎么回事。
Cloud2016 lideyang 我举个例子,之前我用 Stan 跑一个 171 个参数的模型,3.2 万次迭代,花费了 3 个小时左右,我就用 saveRDS 把模型的输出结果给保存,约 40M 的样子。其实在最后模型出来前,还有调参时保留的多个模型结果,但都比这个小。 所以,我有个疑问,你的模型、数据规模有多大?规模很大的话,不一定需要把所有数据和中间结果都保存的,我觉得只把关键的保存一下就行。
fenguoerbian lideyang 实际的内存占用总归不会超过物理内存的数量,但是你在计算机系统里不同的计算方式很可能会有不同的结果。比方说linux下你如果不考虑fork机制的话,那么很容易就可以让看起来的内存占用超过机器的物理内存。 所以如果想更进一步诊断你碰到的问题的话,还是我一开始说的,你能不能给出一个能让大家稳定复现的例子?或者给出一些更具体的描述来?
lideyang 破案了各位! 工作空间中有两个对象,是两个大的list,在rstudio的窗口中显示和用object.size()算出来都是200M左右,用lobstr::obj_size()看,好家伙二三十个G!把这俩一删就好了。感谢 fenguoerbian !感谢参与讨论的各位! 另外把 fenguoerbian 的回答在这里贴一下,供后来人参考: 用lobstr::obj_size或者lobstr::obj_sizes来算算看,结果可能会和object.size不一样的。