メモ:copy-on-modifyの挙動
こういうdata.frameがあるとする。
d1 <- data.frame( x = 1:1000, y = 1:1000, z = 1:1000 ) pryr::object_size(d1) #> 12.9 kB
これをそのままd2
に代入してもメモリ使用量は変化しない。メモリ上のアドレスを共有しているっぽい。
d2 <- d1 pryr::object_size(d1, d2) #> 12.9 kB
[<-
を使うと、実際には値に変更を加えてなくてもメモリ使用量は微増する。
たぶん、中身のベクトルのメモリアドレスは同じままで、それを束ねているリストの部分が別の領域にコピーされた?
d1[integer(0), integer(0)] <- integer(0) pryr::object_size(d1, d2) #> 13.1 kB
中身のベクトルに変更を加えると、そのベクトルだけコピーされる。
d1[1, "x"] <- NA pryr::object_size(d1, d2) #> 17.2 kB
同じベクトルの別の個所に代入してもこれ以上コピーは走らない。
d1[2, "x"] <- NA pryr::object_size(d1, d2) #> 17.2 kB
中身のベクトル全てにコピーが走る。サイズはだいたいはじめの2倍くらいなのでつじつまがあってそう。
d1[1, ] <- NA pryr::object_size(d1, d2) #> 25.3 kB