【问题标题】:R object reference countingR对象引用计数
【发布时间】:2018-10-29 22:11:47
【问题描述】:

我正在调试一个大型 R 包。它正在创建几个对象但不清理内存。有没有办法在 R 中进行引用计数,检查哪个对象被访问了多少次。这将使我对已创建但从未在后面的代码部分中使用的对象有一个粗略的了解。仅供参考,这些对象大部分是 data.table

【问题讨论】:

  • “什么是新的?” cran.r-project.org 的部分指出,从 3.1.0 版开始,可以使用引用计数来编译 R。在这种情况下,您可能可以通过 R 的 C API 访问引用计数。

标签: r data.table reference-counting


【解决方案1】:

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

a <- 1:5
b <- a

a 和 b 指向同一个 SEXPREC,如果两者之一被修改,则需要复制 SEXPREC 以不更改另一个对象的值。但是,如果一个对象的引用计数没有增加,这并不意味着它与计算无关。例如在

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

a 是相关的,但 a 和 b 的引用计数都较低,因为它们指向不同的 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

【讨论】:

  • 谢谢,但词法范围示例需要更改访问变量。我需要一个无需更改代码的解决方案
  • 我知道。但是,正如所解释的,引用计数也不能解决问题。所以剩下的不多了……
猜你喜欢
  • 1970-01-01
  • 2012-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 2011-04-15
相关资源
最近更新 更多