メモ: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