Размеры целочисленных векторов в R - PullRequest
9 голосов
/ 16 августа 2011

Я думал, что 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-клетки подходят.

1 Ответ

12 голосов
/ 16 августа 2011

Даже если вы попробуете N <- 10000, все значения встречаются ровно дважды, за исключением векторов длины: </p>

  • от 5 до 8 (56 байт)
  • от 9 до 12 (72 байта)
  • от 13 до 16 (88 байтов)
  • от 17 до 32 (152 байта)

Тот факт, что число байтов встречается дважды, исходит изтот простой факт, что память распределяется по 8 байтам (которые называются Vcells в ?gc), а целые числа занимают только 4 байта.

Кроме того, внутренняя структура объектов в R делает различиемежду малым и большим векторами для выделения памяти.Маленькие векторы распределяются в больших блоках размером около 2 Кб, тогда как большие векторы распределяются индивидуально.«Маленькие» векторы состоят из 6 определенных классов в зависимости от длины и могут хранить векторные данные размером до 8, 16, 32, 48, 64 и 128 байтов.Поскольку целое число занимает всего 4 байта, у вас есть 2, 4, 8, 12, 16 и 32 целых числа, которые вы можете хранить в этих 6 классах.Это объясняет шаблон, который вы видите.

Дополнительное количество байтов предназначено для заголовка (который образует Ncells в ?gc).Если вы действительно заинтересованы во всем этом, прочитайте руководство R Internals .

И, как вы уже догадались, 24 дополнительных байта взяты из заголовков (или Ncells).На самом деле все немного сложнее, но точные детали можно найти в R innerals manual

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...