gpt4 book ai didi

r - 意外的 R 内存管理行为

转载 作者:行者123 更新时间:2023-12-02 02:56:44 24 4
gpt4 key购买 nike

过去几天我一直在寻找我认为是我编写的 R 程序中某处的内存泄漏。原来这是由一些我不太了解的 R 功能引起的。我的直觉是它与 promise 和惰性评估有关。这是重现问题的示例:

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 中创建函数时会发生什么的任何见解?解决方法?

最佳答案

您返回的函数的封闭环境是传递给apply 的函数的局部环境。显然,函数参数必须存储在这个环境中。通常这个环境在调用后会丢失,但你会保留它,因为你返回了一个闭包。您可以删除不需要的对象:

LF <- apply(M, 1, function(X) {sdX <- sd(X); rm("X"); function(X) X / sdX})
ls(envir = environment(LF[[1]]))
#[1] "sdX"

但是,我仍然没有看到使用闭包的理由并建议重新设计您的整个方法。例如,在这个具体示例中,我将返回标准偏差并将它们作为参数传递给转换函数。

关于r - 意外的 R 内存管理行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48964286/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com