R对象引用计数

3

我正在调试一个较大的R包。它创建了许多对象但不清理内存。是否有一种方法可以在R中进行引用计数,检查哪个对象被访问了多少次。这将给我一个大致的想法,哪些对象在代码的后续部分中创建但从未被使用。值得注意的是,这些对象中的大多数都是data.table。


2
https://cran.r-project.org/ 上的“最新动态”部分指出,自3.1.0版本起,R可以使用引用计数进行编译。在这种情况下,您可能可以通过R的C API访问引用计数。 - Nairolf
1个回答

0

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

a <- 1:5
b <- a

ab指向同一个SEXPREC,如果其中一个被修改,SEXPREC需要被复制以不改变另一个对象的值。然而,如果对象的引用计数没有增加,这并不意味着它对计算没有影响。例如,在以下情况下:

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

a 是相关的,但是因为它们指向不同的 SEXPREC,所以 ab 的引用计数都很低。因此,无法使用 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

谢谢,但词法作用域示例需要更改访问变量。我需要一个不需要更改代码的解决方案。 - adam
我知道。但是,正如所解释的那样,引用计数也行不通。因此剩下的选择不多了... - Nairolf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接