没有赋值的环境中的引用对象

时间:2014-09-19 15:21:39

标签: r memory-management

我有一个看起来像这样的函数:

sampleFcn <- function(c1, c2) {
  chars <- get('chars', envir=.GlobalEnv)
  if (c1 %in% chars) { 
    array[c1,1] <<- array[c1,1] + 1
    if (c2 %in% chars)  bigM[c1,c2] <<- bigM[c1,c2] + 1
  }
}

这将应用于大型数据集。就像现在一样,它起作用但是需要很长时间才能应用,我猜这主要是因为第二行,我不断分配给一个新的变量,一个大的矢量(字符)。我的问题是,我如何调用全局变量&#39; chars&#39;无需经常使用新内存来分配“&get;#39;功能

1 个答案:

答案 0 :(得分:1)

我会重新考虑您对代码效率低下的假设:

library(pryr)
x <- matrix(1:1e6,10)
> object_size(x)
4 MB

track_x <- track_copy(x)

foo <- function(){
    r1 <- mem_change(s <- get("x",.GlobalEnv))
    r2 <- mem_change(2 %in% s)
    list(r1,r2)
}

> foo() #No noticeable memory use
[[1]]
14 kB

[[2]]
1.74 kB


> track_x()
# Nothing changed

> mem_changed(x[1,1] <- x[1,1]+1)
4MB #Increased by 4MB

> track_x()
x copied #Because it copied