R data.frame内存使用 - 特别是在子集之后

时间:2016-11-02 11:43:28

标签: r

我的一位同事对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几乎是正确的。但是,我无法看到存储此信息的位置。

1 个答案:

答案 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