【问题标题】:Tricks to avoid duplication of memory allocation when returning data.table or data.frame in R?在 R 中返回 data.table 或 data.frame 时避免重复内存分配的技巧?
【发布时间】:2013-01-24 12:58:15
【问题描述】:

我创建了一个函数,调用它来读取然后返回一个data.table:

read.in.data <- function(filename)
{
    library(data.table)
    data.holder<-read.table(filename, skip=1)
    return(data.table(data.holder))
}

通过观察我的 RAM 作为函数进程,我注意到 R 似乎分两步处理它(或者至少这是我对正在发生的事情的最佳猜测)。例如,当我加载一个 1.5 GB 的文件(15 列,每行总共 136 个字符)时,R 似乎 1)读取数据并使用 1.5 GB 的 RAM,然后 2)使用另一个 1.5 GB 的 RAM回报。

是否有一些技巧可以创建一个函数来创建 data.table(或 data.frame)并返回 data.table 而无需在内存中复制?还是必须在创建表的函数中对 data.table 进行所有处理?

观察: 如果我连续两次运行此代码,则不会清除内存;由于我只有 8 GB 的 RAM,因此该功能失败。如果我跳过将“read.table”存储在变量中的步骤(如下所示),我不会得到任何好处。我不想以任何方式这样做,因为我希望能够在返回之前清理 data.table 。解决我的问题还可以让我在不耗尽内存的情况下处理更大的文件。

short.read.trk <- function(fntrk)
{
    library(data.table)
    return(data.table(read.table(fntrk, skip=1)))
}

【问题讨论】:

  • 我感受到你的痛苦。在 v1.8.7 中尝试 fread()。它直接创建一个 data.table,因此可以避免(复制) data.table() 包装器,而且它比 read.table 更有效(即使应用了所有已知的技巧)。
  • 谢谢,一旦 1.8.7 在 r-forge 上构建(目前列为“构建失败”),我会立即尝试 fread()。
  • 哎呀 - 谢谢你让我知道 - 我会看看......

标签: r memory-management return data.table


【解决方案1】:

如果您主要追求的是节省内存,您可以一次将其转换为一列:

library(data.table)
read.in.data <- function(filename)
{
  data.holder <- read.table(filename, skip=1)
  dt <- data.table(data.holder[[1]])
  names(dt) <- names(data.holder)[1]
  data.holder[[1]] <- NULL

  for(n in names(data.holder)) {
    dt[, `:=`(n, data.holder[[n]]) ]
    data.holder[[n]] <- NULL
  }
  return(dt)
}

(未经测试)

它不会更快,实际上它可能更慢。但是应该不会浪费内存。

【讨论】:

  • 谢谢,这是一个有趣的方法。我将在周一访问数据集时实施它,并使用结果编辑此评论。
  • +1 有趣的方法。这实际上可能非常快。其他测试方法是 as.data.table() 而不是 data.table() 和(仅供专家使用):setattr(data,"class",c("data.frame","data.table"))
  • +1 我喜欢使用“NULL”来保持低内存的方法。将表格绑定在一起时,我已经尝试过。例如,我尝试使用 dt
  • Docuemada - 对于rbind,您必须一一创建每​​一列,在每个列创建之后分配NULL,而不仅仅是在最后。
  • @KenWilliams 谢谢。这可以解释我的内存波动很大。由于我是 R 新手,您能解释一下为什么需要将 := 放在单引号中吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-30
  • 1970-01-01
  • 1970-01-01
  • 2015-04-05
  • 2018-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多