2011-08-16 4 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

再利用はしばしば隠されているので注意しなければならないが、私は同意する。 –

答えて

12

あなたはN <てみたとしても - 10000を、すべての値が長さのベクトルを除いて、ちょうど2倍発生:12から8へ

  • 5(56バイト)
  • 9(72バイト)
  • 13〜16(88バイト)
  • 17〜32(152バイト)

バイトの数が2回出現するという事実は、単純なFAから来ていますメモリは8バイトの部分(?gcのVcellと呼ばれます)に割り当てられ、整数はわずか4バイトしかかかりません。

次に、Rのオブジェクトの内部構造は、メモリを割り当てるための小さなベクトルと大きいベクトルを区別します。小さなベクトルは約2Kbの大きなブロックに割り当てられ、大きなベクトルは個別に割り当てられます。 「小さい」ベクトルは、長さに基づいて6つの定義されたクラスで構成され、最大8,16,32,48,64および128バイトのベクトルデータを格納することができます。整数は4バイトしか取らないので、これらの6つのクラスに格納できる2,4,8,12,16,32の整数があります。これはあなたが見るパターンを説明しています。

余分なバイト数は、ヘッダ(Nセルを?gcに形成する)のためのものです。本当にこのすべてに興味がある場合は、R Internalsマニュアルを読んでください。

あなたが推測したように、余分な24バイトはヘッダー(またはNcell)からのものです。実際にはそれより少し複雑ですが、正確な詳細はR internalsマニュアルにあります

+0

+1として表示するように更新した。非常に洞察に満ちた答え、そして「区別」を使用するための+1(もし可能ならば)です。 – Iterator

+0

aargh ... "区別"の代わりに "区別"する必要があります。それは英語に翻訳されたオランダ語です。 –

+0

いいえ、それは問題ありません。区別は区別のための同義語です。単なる人間ではあまり使われていません。 – Iterator