> length(row)
[1] 1000
> object.size(row)
8024 bytes
> object.size(row[1])
32 bytes
此处的行是一个列表。 行的上方长度为1000,其元素的大小为32个字节。因此,列表的总大小应为32 * 1000字节,但由于某种原因,其大小应为8024。这可能是什么原因?混淆R中物体的大小
> length(row)
[1] 1000
> object.size(row)
8024 bytes
> object.size(row[1])
32 bytes
此处的行是一个列表。 行的上方长度为1000,其元素的大小为32个字节。因此,列表的总大小应为32 * 1000字节,但由于某种原因,其大小应为8024。这可能是什么原因?混淆R中物体的大小
初始开销:
> 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
32字节用于长度为1的矢量加上每个进一步元件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-06 11:04:05
不,它不。它完全解释你观察到的行为。 R中长度为N的向量需要24 + 8N个字节,而不是32N个字节。你没有给我们一个方法来复制你的“行”对象,这个问题是真正的额外问题。 – Spacedman 2013-04-06 18:25:14
列表可以包含可变长度的元素。只有数据帧将具有相同长度的行。
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-06 11:06:48
这里的长度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字节。
这提供了一个什么样的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)]
只有一个NULL
在R会话对象,并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)
“行”真的是一个列表?你是如何创建它的?如果你向我们表明这会提出更好的问题。 – Spacedman 2013-04-06 08:25:15