Tengo un marco de datos grande (del orden de varios GB) que me gustaría convertir a data.table. El uso as.data.tablecrea 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.truelengthmiembro 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 inicializantruelengthen 0 antes de solicitaralloc.colcompatibilidad con versiones anteriores a R 2.14.0.alloc.colse vetruelengthcomo 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.