web-dev-qa-db-fra.com

Convertir un cadre de données en un fichier data.table sans copie

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
65
ytsaig

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 un list (nommé et/ou non nommé), data.frame (ou data.table) en tant qu’entrée et retourne le même objet qu’un data.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).

76
Arun