【问题标题】:Sizes of integer vectors in RR中整数向量的大小
【发布时间】:2011-10-28 03:06:24
【问题描述】:

我原以为 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 单元格,但我一直无法在文档中找到明确的定义。

【问题讨论】:

  • 这很可能是object.size 实现的产物。请注意帮助如何将其描述为估算值...
  • @Nick:哦不,这有点吓人,因为我非常依赖object.size()。感谢您的指点。当我读到它时,由于可能的归因(甚至可能是编码)问题而出现了不确定性。但是生活中没有比整数向量更简单的了。
  • 我同意,但无论如何你都必须小心,因为重用通常是隐藏的(只需查看两个巨大的 data.frame 的 object.size 共享除了 1 列之外的所有内容)
  • 我更新了表格以显示为 5x20

标签: r memory-management


【解决方案1】:

即使你尝试 N

  • 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手册中找到

【讨论】:

  • +1 表示非常有见地的答案,+1(如果可以的话)表示使用“区分”。
  • aargh... 这应该是“区分”而不是“区分”。这是荷兰语翻译成英语。
  • 不,没关系:区分是区分的同义词。它只是凡人不常用。
猜你喜欢
  • 2018-05-02
  • 2015-10-27
  • 1970-01-01
  • 2021-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多