2017-05-11 424 views
0

一是管理内存分配,这个问题是不是R:在循环

Error: cannot allocate vector of size n

我接受这个错误是给定的,我试图避免该错误代码

  • 我有3000+变量和120000箱子

  • 所有列是数字的数据集

  • 我需要将0重置为零

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

  • 所以我在同一时间重新分配的值为零一列:`

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

后约1000列,我仍然得到内存分配错误。

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

此外,我试过每次循环后调用垃圾收集功能,我仍然得到了内存分配错误。

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

+1

将您的数据分割成列表,将函数应用到列表中,然后重新组合 –

+0

谢谢,我会试试看。但是,你能解释为什么这个循环导致增量内存分配? – Jake

+0

也请随时发布答案,我会upvote。我讨厌张贴对我自己的问题的答案,但讨厌留下一个问题未回答更多 – Jake

回答

0

我学到关于R内存使用情况的一个重要基本原则。

See this discussion.

徘徊无论尽可能避免通过数据帧循环。使用lapply。这将数据框转换为列表,然后在列表上运行相关功能。然后它返回一个列表。将列表转换回数据框。

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

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