r:在循环中管理内存分配

时间:2017-05-11 19:19:38

标签: r

首先,这个问题与

无关
  

错误:无法分配大小为n的向量

我接受此错误作为给定,我试图避免代码中的错误

  • 我有3000多个变量的数据集和120000个案例

  • 所有列均为数字

  • 我需要重置NA

  • 如果我为整个数据集重新赋值为0,我会得到内存 分配错误。

  • 所以我一次将值重新分配给一列:“

    resetNA  <- function(results)
    {
       for (i in 1:ncol(results))
       {
              if(i>10)
              {
                      results[,i][is.na(results[,i])] <- 0
              }
       }
        print(head(results))
    }
    

大约1000列之后,我仍然会收到内存分配错误。

现在,这对我来说似乎很奇怪。不知何故,内存分配在每个循环后递增。但是,我不明白为什么会这样。

另外,我尝试在每次循环后调用垃圾收集功能,我仍然遇到内存分配错误。

有人可以向我解释如何管理变量以避免内存分配的增量增加(毕竟,数据帧大小没有改变)。

2 个答案:

答案 0 :(得分:0)

如上面的评论中所述,答案是hereFastest way to replace NAs in a large data.table

我尝试了它并且效果很好

答案 1 :(得分:0)

我已经学会了关于r内存使用的一个重要的一般原则。

See this discussion.

尽可能避免循环数据帧。使用lapply。这会将数据帧转换为列表,然后在列表中运行相关的函数。然后它返回一个列表。将列表转换回数据帧。

以下示例将数字频率重新编码为分类变量。它速度快,不会增加内存使用量。

    list1<-lapply(mybigdataframe,function(x) ifelse( x>0,"Yes","No"))
    newdf1<-as.data.frame(list1)