2016-02-12 7 views
9

ディスクからロードされたdata.tableに新しい列が追加されると、コピーされます。新しい列を追加するときにdata.tableがコピーされるのはなぜですか?

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" 

これはバグですか、何か間違っていますか?私は1.9.6のdata.tableパッケージを使用しています。

答えて

9

data.tableは、data.tableが作成されたときに列ベクトルのリストにポインタスロットをオーバー・アロケートすることによって列を追加するときのコピーを回避します。このようにdata.tableをロードすると、オーバー・アロケーションは起こらず、一度カラムを追加すると完了します。これによりコピーが必要になります。 help("truelength")を引用する

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 

:ディスクからロードされたテーブルについて

を但し、truelengthはR = 2.13.2 <でR 2.14.0及びランダムに0です。両方の場合においておそらく予想外である。 data.tableはこの状態を検出し、次の列の追加または削除が発生すると、ロードされたdata.tableをオーバー・アロケートします。 data.tableの他のすべての操作(高速グループ化や結合など)には、真の長さは必要ありません。

カラムの削除中にコピーが行われないため、ドキュメントの期限が少し切れているようです。

data.tableの「通常の」作成中に過剰に割り当てられた列を追加すると、コピーも発生します。

+0

ありがとうございます。しかし、文 'data.tableはこの状態を検出し、次の列の追加または削除が発生したときに、ロードされたdata.tableをオーバー・アロケートします。上記の例のように、列を追加する前に削除されます。 – imsc

+0

はい、ドキュメントには更新が必要です。それをdata.table issue trackerに持ってきてください。 – Roland

関連する問題