【问题标题】:r: managing memory allocation in loopsr:在循环中管理内存分配
【发布时间】:2017-10-10 23:01:16
【问题描述】:

首先,这个问题不是关于

错误:无法分配大小为 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 个副本。有时需要显式调用垃圾回收:?gc

标签: r


【解决方案1】:

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

我试过了,效果很好

【讨论】:

    【解决方案2】:

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

    See this discussion.

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-10-16
      • 2021-07-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-31
      • 2019-10-22
      • 2017-05-03
      • 1970-01-01
      • 2015-12-16
      相关资源
      最近更新 更多