首页 文章

R中整数向量的大小

提问于
浏览
9

我原以为R有一个标准的开销用于存储对象(24个字节,似乎,至少对于整数向量),但一个简单的测试显示它比我意识到的更复杂 . 例如,采用长度为100的整数向量(使用随机抽样,希望避免任何sneaky sequence compression tricks that might be out there),我发现不同长度的向量可以具有相同的大小,如下所示:

> 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单元出现了 .

1 回答

  • 12

    即使你尝试N < - 10000,所有值都会出现两次,除了长度为向量的矢量:

    • 5到8(56字节)

    • 9到12(72字节)

    • 13到16(88字节)

    • 17到32(152字节)

    字节数出现两次这一事实来自于一个简单的事实,即内存分配为8个字节(在 ?gc 中称为Vcells),整数只占用4个字节 .

    接下来,R中对象的内部结构区分了用于分配内存的小向量和大向量 . 小矢量分配在大约2Kb的较大块中,而较大的矢量分别分配 . “小”向量由6个定义的类组成,基于长度,并且能够存储最多8,16,32,48,64和128字节的向量数据 . 由于整数只需要4个字节,因此您可以在这6个类中存储2个,4个,8个,12个,16个和32个整数 . 这解释了您看到的模式 .

    额外的字节数用于标头(在 ?gc 中形成Ncells) . 如果你真的对这一切感兴趣,请阅读R Internals手册 .

    并且,正如您猜测的那样,24个额外字节来自标头(或Ncells) . 事实上它比这更复杂,但确切的细节可以在R internals手册中找到

相关问题