在R语言中整数向量的大小

9

我曾经认为R语言在存储对象时有一个标准的开销(似乎至少对于整数向量是24字节),但简单的测试表明它比我意识到的要更加复杂。例如,使用随机抽样将整数向量长度限制在100以内(希望避免任何可能存在的狡猾的序列压缩技巧),我发现不同长度的向量可以具有相同的大小,如下所示:

> N   = 100
> V   = vector(length = 100)
> for(L in 1:N){
+     z = sample(N, L, replace = TRUE)
+     V[L]    = object.size(z)
+ }
> 
> options('width'=88)
> V
  [1]  48  48  56  56  72  72  72  72  88  88  88  88 104 104 104 104 168 168 168 168
 [21] 168 168 168 168 168 168 168 168 168 168 168 168 176 176 184 184 192 192 200 200
 [41] 208 208 216 216 224 224 232 232 240 240 248 248 256 256 264 264 272 272 280 280
 [61] 288 288 296 296 304 304 312 312 320 320 328 328 336 336 344 344 352 352 360 360
 [81] 368 368 376 376 384 384 392 392 400 400 408 408 416 416 424 424 432 432 440 440

我对出现的 152 值印象深刻(观察:152 = 128 + 24,尽管280 = 256 + 24不如此显著)。有人能解释一下这些分配是如何产生的吗?我在文档中没有找到清晰的定义,尽管V细胞出现了。

3
这很可能是object.size实现的一种偏差。请注意帮助文档中将其描述为一个估计值... - Nick Sabbe
1
@Nick:哦不,这有点令人毛骨悚然,因为我很依赖object.size()。感谢指引。据我所知,不确定性是由于可能的属性(或甚至编码)问题而产生的。但是在生活中没有比整数向量更简单的东西了。 - Iterator
我同意,不过你仍需小心,因为重复利用通常是隐藏的(只需看看共享所有但1列的两个巨大数据框的object.size即可)。 - Nick Sabbe
我更新了表格,使其显示为5x20。 - smci
1个回答

14
即使你尝试 N <- 10000,所有的值都会出现两次,除了长度为:
  • 5到8(56个字节)
  • 9到12(72个字节)
  • 13到16(88字节)
  • 17到32(152字节)

这些长度出现两次的事实,源于内存以8字节为一块(在 ?gc 中称为Vcells)进行分配,而整数只占用4个字节。

此外,R中对象的内部结构对小型和大型向量进行了区分以便于分配内存。小型向量是在约2 Kb大小的大块中分配的,而较大的向量则单独分配。这些“小型”向量包括6个定义类别,根据长度定义,能够存储高达8、16、32、48、64和128字节的向量数据。由于一个整数只占用4个字节,因此在这6个类别中,您可以存储2、4、8、12、16和32个整数。这解释了你看到的模式。

额外的字节数用于头文件(在 ?gc 中形成Ncells)。如果您真的对所有这些内容感兴趣,请阅读 R Internals 手册。

正如您猜测的那样,多余的24个字节来自头文件(或Ncells)。事实上,这比这更加复杂,但确切的细节可以在 R internals 手册中找到。


1
对于一个非常有见地的回答,我会点赞+1,并且如果可以的话,我也会因为使用了“distinguishment”而再次点赞+1。 - Iterator
啊...应该是“distinguishes”而不是“makes a distinguishment”。这是荷兰语翻译成英语的结果。 - Joris Meys
不,没关系:distinguishment是distinction的同义词。只是普通人不常用而已。 - Iterator

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接