2011-08-16 3 views
9

Я думал, что R имеет стандартные накладные расходы для хранения объектов (24 байта, кажется, по крайней мере для целых векторов), но простой тест показал, что он более сложный, чем я понял. Так, например, принимая целые векторы длиной до 100 (с использованием случайной выборки, в надежде, чтобы избежать любого sneaky sequence compression tricks that might be out there), я обнаружил, что разные векторы длины могут иметь один и тот же размер, как показано ниже:Размеры целочисленных векторов в R

> 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'. Обратите внимание, как справка описывает это как оценку ... –

+1

@Nick: О нет, это как-то странно, потому что я сильно зависим от 'object.size()'. Спасибо за указатель. Поскольку я читаю, что неопределенность возникает из-за возможной проблемы с атрибуцией (или, может быть, даже с кодировкой). Но в жизни не так уж много проще, чем целые векторы. – Iterator

+0

Я согласен, хотя вы должны быть осторожны, так как повторное использование часто скрыто (просто посмотрите на object.size из двух огромных данных. Кадры, разделяющие все, кроме одного столбца). –

ответ

12

Даже если вы пытаетесь N < - 10000, все значения происходит ровно в два раза, для векторов длины, за исключением:

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

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

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

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

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

+0

+1 для очень проницательный ответ и +1 (если бы я мог) за использование «отличия». – Iterator

+0

aargh ... это должно быть «отличает» вместо «делает отличия». Это голландский перевод на английский. –

+0

Нет, это прекрасно: отличия - синоним различия. Это просто не используется обычными смертными. – Iterator

Смежные вопросы