将数据框转换为data.table而无需复制

我有一个很大的数据框(大约几GB),我想转换为data.table 。 使用as.data.table会创build一个数据框的副本,这意味着我需要可用的内存至less是数据大小的两倍。 有没有办法转换没有副本?

这里有一个简单的例子来演示:

 library(data.table) N <- 1e6 K <- 1e2 data <- as.data.frame(rep(data.frame(rnorm(N)), K)) gc(reset=TRUE) tracemem(data) data <- as.data.table(data) gc() 

输出:

 library(data.table) # data.table 1.8.10 For help type: help("data.table") N <- 1e6 K <- 1e2 data <- as.data.frame(rep(data.frame(rnorm(N)), K)) gc(reset=TRUE) # used (Mb) gc trigger (Mb) max used (Mb) # Ncells 303759 16.3 597831 32.0 303759 16.3 # Vcells 100442572 766.4 402928632 3074.2 100442572 766.4 tracemem(data) # [1] "<0x363fda0>" data <- as.data.table(data) # tracemem[0x363fda0 -> 0x31e4260]: copy as.data.table.data.frame as.data.table gc() # used (Mb) gc trigger (Mb) max used (Mb) # Ncells 304519 16.3 597831 32.0 306162 16.4 # Vcells 100444242 766.4 322342905 2459.3 200933219 1533.0 

这是从v1.9.0 + 。 来自NEWS :

o在这个SO post之后 ,现在实现了一个函数setDT ,它将一个list (命名和/或未命名), data.frame (或data.table )作为input,并通过引用返回与data.table相同的对象(没有任何复制)。 请参阅?setDT示例以获取更多信息。

这符合data.table命名约定 – 所有set*函数都通过引用进行修改。 :=是唯一的另一个也通过引用修改。

 require(data.table) # v1.9.0+ setDT(data) # converts data which is a data.frame to data.table *by reference* 

查看更旧的(现在过时的)答案的历史logging。

这很简单。 在这种情况下,转换R保存为数据框的.csv文件。

 housing_url <- "https://d396qusza40orc.cloudfront.net/getdata%2Fdata%2Fss06pid.csv" download.file(housing_url, destfile = "./housing.csv", method = "curl") require(data.table) DTableFile <- as.data.table(read.csv("./data/housing.csv"))