在R中返回data.table或data.frame时,可以避免重复内存分配?

Doc*_*ada 5 memory-management r return data.table

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

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

我注意到从观察我的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)))
}
Run Code Online (Sandbox Code Playgroud)

Ken*_*ams 2

如果您主要追求节省内存,则可以一次转换一列:

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)
}
Run Code Online (Sandbox Code Playgroud)

(未经测试)

它不会更快,事实上可能会更慢。但应该减少内存浪费。