r - 在 R 中返回 data.table 或 data.frame 时避免重复内存分配的技巧?

标签 r memory-management 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))
}

我通过观察我的 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)))
}

最佳答案

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

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)
}

(未经测试)

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

关于r - 在 R 中返回 data.table 或 data.frame 时避免重复内存分配的技巧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14778017/

相关文章:

r - 数据框到字表?

r - R 中的手动感知器示例 - 结果可以接受吗?

c - 如何释放内存并同时返回指针?

c - malloc : Anonymous mapping and magic area

java - 尝试 catch block 变量超出范围

r - 具有时间点的分箱纵向数据的意大利面条图

r - R中setdiff()函数的异常行为

iPhone:对象保留其委托(delegate)是否有意义?

java - 编写一个返回整数最后一位数字的方法

javascript - ES6函数返回 `undefined`而不是预期的字符串?