我应该习惯在R中删除未使用的变量吗?

HBa*_*Bat 13 memory variables performance r

目前我正在使用相对较大的数据文件,而我的计算机不是超级计算机.我正在临时创建这些数据集的许多子集,而不是从工作区中删除它们.显然,这些正在使许多变量混乱.但是,在R的性能上有许多未使用的变量会有什么影响吗?(即计算机的内存是否在某些时候填满?)
编写代码时,我应该养成去除未使用变量的习惯吗?值得吗?

x <- rnorm(1e8)
y <- mean(x)
# After this point I will not use x anymore, but I will use y
# Should I add following line to my code? or 
#   Maybe there will not be any performance lag if I skip the following line:
rm(x)
Run Code Online (Sandbox Code Playgroud)

我不想在我的代码中添加另一行.而不是我的代码看起来混乱,我更喜欢我的工作区杂乱(如果没有性能改善).

Hon*_*Ooi 16

是的,拥有未使用的对象会影响您的性能,因为R将其所有对象存储在memry中.显然,小对象的影响可以忽略不计,而且你大多只需要删除非常大的对象(数百万行的数据框等),但是拥有整洁的工作空间不会对任何东西造成伤害.

唯一的风险是删除以后需要的东西.即使按照建议使用回购,意外破坏东西也是你想要避免的.

解决这些问题的一种方法是广泛使用local.当你进行散布在许多临时对象周围的计算时,你可以将它包装在一个local调用中,这将在以后为你有效地处理这些对象.没有更多的清理大量的i,j,x,temp.var,和诸如此类的东西.

local({
    x <- something
    for(i in seq_along(obj))
        temp <- some_unvectorised function(obj[[i]], x)
        for(j in 1:temp)
            temp2 <- some_other_unvectorised_function(temp, j)
    # x, i, j, temp, temp2 only exist for the duration of local(...)
})
Run Code Online (Sandbox Code Playgroud)

  • +1为本地.我经常使用`with`来达到同样的效果. (2认同)
  • @Hong Ooi,问题首发怎么能用这个?如果他们被置于"本地"电话中,那么y和x都不会存在吗? (2认同)

Kar*_*ikS 5

除了上述建议之外,为了帮助像我这样的初学者,我想列出一些检查R内存的步骤:

  1. 使用列出未使用的对象ls()
  2. 使用检查对象 object.size("Object_name")
  3. 使用以下命令删除未使用/不必要的对象 rm("Object_name")
  4. 使用 gc()
  5. 检查内存已使用清除 memory.size()

如果您使用的是新会话,请使用,rm(list=ls())然后使用gc()

如果有人觉得删除未使用的变量的习惯很危险,那么将对象偶尔保存到R图像中始终是一个好习惯。


duf*_*ymo 1

我认为无论语言如何,删除未使用的代码都是一个很好的编程实践。

使用 Subversion 或 Git 等版本控制系统来跟踪更改历史记录也是一个很好的做法。如果您这样做,您就可以放心地删除代码,因为如果需要,总是可以回滚到早期版本。

这是专业编码的基础。

  • OP的问题是关于未使用的变量的性能拖累,而不是未使用的代码。 (4认同)