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

这里的行是一个列表。行的长度为 1000,其元素之一的大小为 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 字节。

这提供了 alist是什么的感觉:

> .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 会话中只有一个对象,并且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 回答