R对象引用计数

时间:2018-10-29 22:11:48

标签: r data.table reference-counting

我正在调试大型R包。它正在创建多个对象,但没有清除内存。有没有一种方法可以在R中进行引用计数,检查哪个对象已被访问了多少次。这将使我大致了解已创建但在以后的代码部分中从未使用过的对象。仅供参考,其中大多数对象都是data.table

1 个答案:

答案 0 :(得分:0)

引用计数是一种机制,用于确定有多少R对象指向同一基础SEXPREC(R对象的C结构)。例如在

a <- 1:5
b <- a

ab指向相同的SEXPREC,如果同时修改了两者之一,则需要复制SEXPREC才能不更改另一个对象的值。但是,如果不增加对象的参考计数,则并不意味着它与计算无关。例如在

a <- 1:5
b <- a+1

a是相关的,但是ab都将具有较低的引用计数,因为它们指向的是不同的SEXPREC。因此,R的引用计数不能用于检查是否创建了但从未使用过

只是为了好玩,人们可以使用词法作用域来计算R对象的访问次数:

obj <- function(x){
    n <- 0
    get <- function() {n <<- n+1; x}
    count <- function() n
    list(get=get, count=count)
}

然后使用

创建一个新的R对象。
a <- obj(1:10)

并使用

进行访问
a$get()
 [1]  1  2  3  4  5  6  7  8  9 10

一个可以计算访问该对象的次数。

a$count()
[1] 1
max(a$get())
[1] 10
a$count()
[1] 2

如果对象的计数为0,则说明它是创建但从未使用过的

b <- obj(2)
b$count()
[1] 0