r - R对象引用计数
问题描述
我正在调试一个大型 R 包。它正在创建几个对象但不清理内存。有没有办法在 R 中进行引用计数,检查哪个对象被访问了多少次。这将使我对已创建但从未在代码的后面部分中使用的对象有一个粗略的了解。仅供参考,这些对象中的大多数都是 data.table
解决方案
引用计数是一种机制,用于确定有多少 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
推荐阅读
- office365 - Office 365 导入作业 PST Rest API
- python - 使用 numpy 在 python 中编写 L-BFGS 最小化函数时出错
- sql - 具有可能具有“多种类型的 NULL”值的列的 SQL 表
- javascript - 基于 Bootstrap 的 Modal 没有出现在 React / Next JS 应用程序中
- python - 使用 plotly 在 3d 散点图中绘制 3d 框
- php - 如何使用 POST 获取可点击的 URL?HTML, PHP
- c# - 使用 .net core 中的活动/非活动记录
- go - 我可以在不为依赖包添加新标签的情况下更新 go mod 依赖包吗
- angular - Ionic / Angular - 如何在不显示可见控件初始化的情况下初始化组件
- docker - 我的 docker 无法再使用 elasticsearch