Tengo un marco de datos grande (del orden de varios GB) que me gustaría convertir a data.table
. El uso as.data.table
crea una copia del marco de datos, lo que significa que necesito que la memoria disponible sea al menos el doble del tamaño de los datos. ¿Hay alguna forma de realizar la conversión sin una copia?
Aquí hay un ejemplo simple para demostrar:
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()
Con salida:
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
fuente
truelength
.truelength
miembro del encabezado vectorial de R no fue inicializado por R. En C, si no inicializa una variable, tiene contenido indefinido (lo que sea que esté en ese trozo de RAM anteriormente).data.table()
y creadores similares se inicializantruelength
en 0 antes de solicitaralloc.col
compatibilidad con versiones anteriores a R 2.14.0.alloc.col
se vetruelength
como una entrada (0 se toma para significar longitud verdadera == longitud). En un momento pensé que data.table tendría que depender de R> = 2.14.0 debido a esto, pero logré mantenerlo R> = 2.12.0. Pruebo con R2.12.0 antes de cada lanzamiento a CRAN.