> 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