J'ai une grande trame de données (de l'ordre de plusieurs Go) que j'aimerais convertir en data.table
. En utilisant as.data.table
crée une copie du cadre de données, ce qui signifie que j'ai besoin de mémoire disponible pour avoir au moins deux fois la taille des données. Y at-il un moyen de faire la conversion sans copie?
Voici un exemple simple à démontrer:
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()
Avec sortie:
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
Ceci est disponible à partir de v1.9.0 + . De NOUVELLES :
o Suivant cet article S.O. , une fonction
setDT
est maintenant implémentée et prend unlist
(nommé et/ou non nommé),data.frame
(oudata.table
) en tant qu’entrée et retourne le même objet qu’undata.table
par référence (sans copie). Voir?setDT
exemples pour plus.
Ceci est conforme à data.table
convention de nommage - tous set*
fonctions modifie par référence. :=
est le seul autre qui modifie également par référence.
require(data.table) # v1.9.0+
setDT(data) # converts data which is a data.frame to data.table *by reference*
Voir l'historique des réponses plus anciennes (maintenant obsolètes).