-1
> length(row)
[1] 1000
> object.size(row)
8024 bytes
> object.size(row[1])
32 bytes

ここで行はリストです。上記の行の長さは 1000 で、その要素の 1 つのサイズは 32 バイトです。したがって、リストの合計サイズは 32*1000 バイトである必要がありますが、何らかの理由で 8024 バイトになります。この理由は何ですか?

4

3 に答える 3

5

初期オーバーヘッド:

> row = runif(1000)
> object.size(row[1])
32 bytes
> object.size(row[1:2])
40 bytes
> object.size(row[1:3])
56 bytes
> object.size(row[1:4])
56 bytes

長さ 1 のベクトルに 32 バイト、さらに各要素に 8 バイト。ローエンドでは、16 バイトを取得することもありますが、平均すると 8 バイトになります。

開始時の余分なバイトは、R が長さとその他の属性をどこかに保持する必要があるためです。

require(plyr)
size = ldply(1:200,function(i){object.size(row[1:i])})$V1
plot(1:200,size,type="l")
于 2013-04-06T08:24:08.810 に答える
3

これが長さ1000のリストです

> lst = vector("list", 1000)
> object.size(lst)
8040 bytes

リスト、リストのlist()要素、lst[[1]]および各リスト要素へのポインターで構成されます。

> object.size(list())
40 bytes
> object.size(row[[1]])
0 bytes
> object.size(lst[1]) - object.size(list())
8 bytes
> object.size(lst[1:2]) - object.size(list())
16 bytes

全体のリスト構造は 40 バイトかかります。各要素は 0 バイトです。各ポインタは 8 バイトです。したがって、40 + 1000 * 0 + 1000 * 8 = 8040 バイトです。

これにより、 a とは何かがわかりますlist

> .Internal(inspect(list()))
@586b6690 19 VECSXP g0c0 [] (len=0, tl=0)

VECSXPメモリ管理に関連する特定のステータスとg0c0その長さなどに関する属性を持つ特定のタイプ ( ) を持つ構造体を指すメモリ内の場所。この構造は明らかに 40 バイトを占めます。リストは、リストに類似したデータ構造を持つオブジェクトを含むという点で、再帰的です。

> .Internal(inspect(list(1)))
@585b35d8 19 VECSXP g0c1 [] (len=1, tl=0)
  @585b3578 14 REALSXP g0c1 [] (len=1, tl=0) 1
> .Internal(inspect(list(1:3)))
@5872ca98 19 VECSXP g0c1 [] (len=1, tl=0)
  @584fc9b8 13 INTSXP g0c2 [] (len=3, tl=0) 1,2,3
> .Internal(inspect(list(1, 2)))
@584fc980 19 VECSXP g0c2 [] (len=2, tl=0)
  @5872c918 14 REALSXP g0c1 [] (len=1, tl=0) 1
  @5872c8e8 14 REALSXP g0c1 [] (len=1, tl=0) 2

実際にNULLは、オブジェクトによって表され、メモリを消費します。

> .Internal(inspect(NULL))
@1169b08 00 NILSXP g0c0 [NAM(2)] 

NULLR セッションにはオブジェクトが1 つしかなくobject.size、それをリストに関連付けません。

あなたが実際に何をしているのrowか、32ビットまたは64ビットのオペレーティングシステムを使用しているか、使用しているRのバージョンがわかりません。私は持っている

> sessionInfo()
R version 3.0.0 Patched (2013-04-03 r62485)
Platform: x86_64-unknown-linux-gnu (64-bit)
于 2013-04-06T11:34:28.743 に答える
1

リストには可変長の要素を含めることができます。同じ長さの行を持つのは、データ フレームだけです。

l<-list(c(1,2), "klklkl", 3:10)
l<-list(c(1,2), "klklkl", 3:10)
object.size(l)  ---200 bytes
object.size(l[1]) --71 bytes
于 2013-04-06T08:23:12.253 に答える