2016-02-12 13 views
9

Wenn eine neue Spalte zu einer data.table hinzugefügt wird, die von der Festplatte geladen wird, wird sie kopiert.Warum wird data.table beim Hinzufügen einer neuen Spalte kopiert?

library('data.table') 
dt <- data.table(a=1,b=2) 
save.image("test.RData") 
load("test.RData") 
dt 
$ a b 
$1: 1 2 

class(dt) 
$[1] "data.table" "data.frame" 

address(dt) 
$[1] "00000000046F1F38" 

dt[, b := NULL] 
address(dt) 
$[1] "00000000046F1F38" 
dt[, c := 2] 
address(dt) 
$[1] "000000000D815618" 

Ist das ein Fehler oder mache ich etwas falsch? Ich verwende 1.9.6 des Pakets data.table.

Antwort

9

data.table vermeidet Kopien beim Hinzufügen von Spalten durch Überzuteilung von Pointer-Slots für die Liste der Spaltenvektoren, wenn die data.table erstellt wird. Wenn Sie die data.table wie folgt laden, ist die Überallokation nicht passiert und wird ausgeführt, sobald Sie eine Spalte hinzufügen. Dies macht eine Kopie notwendig.

library('data.table') 
dt <- data.table(a=1,b=2) 
save.image("test.RData") 
load("test.RData") 

truelength(dt) 
#[1] 0 

dt[, b := NULL] 
truelength(dt) 
#[1] 0 

dt[, c := 2] 
truelength(dt) 
#[1] 101 

zitieren help("truelength"):

Für von der Festplatte jedoch geladen Tabellen, truelength 0 in R 2.14.0 und zufällig in R < = 2.13.2; in beiden Fällen vielleicht unerwartet. data.table erkennt diesen Status und ordnet die geladene data.table zu viel zu, wenn die nächste Spalte hinzugefügt oder gelöscht wird. Alle anderen Vorgänge in der data.table (z. B. schnelle Gruppierung und Joins) benötigen keine tatsächliche Länge.

Es scheint, dass die Dokumentation etwas veraltet ist, da die Kopie beim Löschen einer Spalte nicht erfolgt.

Beachten Sie, dass eine Kopie auch dann erfolgt, wenn Sie mehr Spalten hinzufügen, als bei der "normalen" Erstellung einer data.table überbelegt wurden.

+0

Danke für die Erklärung. Die Anweisung "data.table" erkennt diesen Status jedoch und ordnet die geladene Datei "data.table" zu sehr zu, wenn die nächste Spalte hinzugefügt oder gelöscht wird. "Scheint nicht zu gelten. Wie im obigen Beispiel wird eine Spalte vor dem Hinzufügen gelöscht. – imsc

+0

Ja, die Dokumentation benötigt anscheinend ein Update. Fühlen Sie sich frei, dies zum data.table issue tracker zu bringen. – Roland

Verwandte Themen