我有一个适合模型的函数,我用相同的大矩阵多次调用该模型(每次在内部创建不同的公式)。然而,似乎 R 保存了我一路使用的数据的副本,所以我的记忆爆炸了。
函数内部的简单删除可以避免这个问题。但是,有没有一种通用的方法可以避免每次都保留整个环境?
例如,运行以下命令,
test <- function(X, y, rm.env=F){
df <- cbind(y, X)
names(df) <- c("label", paste0("X", as.character(1:ncol(X))))
f <- formula(label~1, data=df, env=emptyenv())
if (rm.env){
rm(list=c("df", "X", "y"))
}
print(pryr::object_size(f))
return(f)
}
X <- matrix(rnorm(700*10000), ncol=700)
y <- rnorm(10000)
m <- test(X, y)
print(pryr::object_size(m))
m <- test(X, y, rm.env=T)
print(pryr::object_size(m))
结果是,
672 B
168 MB
672 B
1.13 kB
请注意,第一次调用中的对象后面有 168 MB,因此一遍又一遍地调用第一个版本会很快消耗大量内存。