最近几天我一直在寻找我编写的R程序中的内存泄漏问题。后来发现原来是由于我不太了解一些R语言特性所致,我的猜测是与promises和lazy evaluation有关。以下是一个重现该问题的示例:
M <- matrix(rnorm(1E7), 1000)
format(object.size(M), "Mb") ## An 80 Mbs matrix
gc() ## Memory usage should be around 80 Mbs
LF <- apply(M, 1, function(X) {sdX <- sd(X); function(X) X / sdX})
format(object.size(LF), "Mb") ## 2.9 Mb (isn't it a lot for a few functions? but it's not really the point)
gc() ## Memory usage is at 158 Mbs event though our workspace only contains two objects of 80 and 2.9 Mbs
rm(M)
gc() ## Back to around 80 Mbs but M is gone
rm(LF)
gc() ## Back to normal
如果我们重复操作的次数太多,您会发现内存使用量会失控。看起来 R 需要存储整个矩阵才能调用LF
中的函数。当我们在LF
中创建函数时会发生什么?有什么解决方法吗?
ls(envir = environment(LF[[1]]))
。R必须将这些对象与每个函数关联起来,否则如果您从全局环境中删除了M
,它们将无法工作。我的建议是:不要这样做。如果您描述了为什么要这样做,我们可以提供替代方案。 - RolandsdX
存储在某个地方,但为什么它要存储整个列呢?它只需要存储小的sdX
值就可以了。 - eaglefreeman