Ich habe einen großen Datenrahmen (in der Größenordnung von mehreren GB), den ich in einen konvertieren möchte data.table
. Mit using as.data.table
wird eine Kopie des Datenrahmens erstellt. Dies bedeutet, dass der verfügbare Speicher mindestens doppelt so groß wie die Daten sein muss. Gibt es eine Möglichkeit, die Konvertierung ohne Kopie durchzuführen?
Hier ist ein einfaches Beispiel, um zu demonstrieren:
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()
Mit Ausgabe:
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
quelle
truelength
.truelength
Mitglied des Vektorkopfs von R nicht von R initialisiert. Wenn Sie in C keine Variable initialisieren, hat sie undefinierten Inhalt (was auch immer sich zuvor in diesem RAM-Block befindet).data.table()
und ähnliche Ersteller werdentruelength
auf 0 initialisiert , bevoralloc.col
Kompatibilität mit Pre R 2.14.0 gefordert wird.alloc.col
wirdtruelength
als Eingabe betrachtet (0 bedeutet Kraftlänge == Länge). Irgendwann dachte ich, dass data.table aus diesem Grund von R> = 2.14.0 abhängen müsste, schaffte es aber, R> = 2.12.0 beizubehalten. Ich teste mit R2.12.0 vor jeder Veröffentlichung auf CRAN.