我的一位同事对R data.frame
中的开销(就内存而言)感兴趣。他使用以下示例:
n = 1e6
df = data.frame(v1=rnorm(n), v2 = rnorm(n))
object.size(df)-sum(sapply(df, object.size)) # some overhead in the df
#>696 bytes
一切都很好。现在,我们来看看这个data.frame
idx = as.logical(rbinom(n, size = 1, prob = 0.99))
df0 = df[idx,]
那么 - df0
的开销应该与df
的开销相同吗?
object.size(df0) - sum(sapply(df0, object.size))
#> 3961136 bytes
引用Grinch“Wrongo!”在我看来,有关子集变量的信息存储在这里,因为如果我将其更改为:
object.size(df0) - sum(sapply(df0, object.size)) - object.size(idx[idx])
然后我得到648 bytes
几乎是正确的。但是,我无法看到存储此信息的位置。
答案 0 :(得分:1)
这是行名称。原始data.frame获得了隐式行名称。
.row_names_info(df, type = 0)
#[1] NA -1000000
.row_names_info(df0, type = 0)
# [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
#[28] 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 45 46 47 48 49 50 51 52 53 54 55 56
#[55] 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
#<snip>
object.size(.row_names_info(df0, type = 0))
#3960008 bytes