我原本以为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单元出现了。
答案 0 :(得分:12)
即使您尝试N < - 10000,除了长度为矢量外,所有值都会出现两次:
字节数出现两次这一事实来自于一个简单的事实,即内存分配为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手册中找到