, sen 40 bayt olan, R. nesnelerin Her nesne, Verisiz bile bir nesne ile ilişkili bellek yükü hakkında biraz bilmek gerekir (typeof()
tarafından döndürülen gibi) bu bellek nesnesi tipini saklamak için kullanılan
x0 <- numeric()
object.size(x0)
# 40 bytes
ve bellek yönetimi için gerekli diğer meta: onunla ilişkili verileri.
Bu ek yükü göz ardı ettikten sonra, bir vektörün bellek kullanımının vektörün uzunluğuyla orantılı olmasını bekleyebilirsiniz. Bu bellek kullanımı gibi görünüyor
sizes <- sapply(0:50, function(n) object.size(seq_len(n)))
plot(c(0, 50), c(0, max(sizes)), xlab = "Length", ylab = "Bytes",
type = "n")
abline(h = 40, col = "grey80")
abline(h = 40 + 128, col = "grey80")
abline(a = 40, b = 4, col = "grey90", lwd = 4)
lines(sizes, type = "s")
vektörün uzunluğuna kabaca orantılıdır, ancak 168 byte ve küçük süreksizliklerinde büyük süreksizliği her vardır: en araziler bir çift ile bir kontrol edelim birkaç adım. Büyük süreksizlik, R'nin vektörler için iki depolama havuzuna sahip olmasından kaynaklanıyor: R tarafından yönetilen küçük vektörler ve işletim sistemi tarafından yönetilen büyük vektörler (Bu, bir performans optimizasyonu, çünkü çok az miktarda bellek ayırmak pahalıdır).
sizes - 40
# [1] 0 8 8 16 16 32 32 32 32 48 48 48 48 64 64 64 64 128 128 128 128
# [22] 128 128 128 128 128 128 128 128 128 128 128 128 136 136 144 144 152 152 160 160 168
# [43] 168 176 176 184 184 192 192 200 200
128 64 den adım büyük nedenleri: Küçük vektörler sadece bir kez biz 40 bayt yükü kaldırmak hangi, 8, 16, 32, 48, 64 veya 128 bayt uzunluğunda olabilir, gördüğümüz tam olarak ne
# diff(sizes)
# [1] 8 0 8 0 16 0 0 0 16 0 0 0 16 0 0 0 64 0 0 0 0 0 0 0 0 0 0 0
# [29] 0 0 0 0 8 0 8 0 8 0 8 0 8 0 8 0 8 0 8 0 8 0
: Eskiden büyük vektör havuza geçtim bir kez adım, daha sonra, vektörler 8 bayt (bellek belirli bir boyuttaki birimlerinde gelir ve R yarım birim için sormak olamaz) parçaları tahsis edilir
Peki bu davranış matrislerle gördüğünüzle nasıl örtüşüyor? Öncelikle biz bir matris ile ilişkili ek yükü bakmak gerekir:
xv <- numeric()
xm <- matrix(xv)
object.size(xm)
# 200 bytes
object.size(xm) - object.size(xv)
# 160 bytes
Yani bir matris bir vektör ile karşılaştırıldığında depolama fazladan 160 bayt ihtiyacı
. Neden 160 bayt?bir matris iki tamsayılar içeren bir
dim
niteliği vardır çünkü, ve nitelikleri bir
pairlist
(
list()
eski bir sürümünü) saklanır:
object.size(pairlist(dims = c(1L, 1L)))
# 160 bytes
önceki yerine vektörlerin matrisler kullanılarak arsa ve artış yeniden çizerseniz
msizes <- sapply(0:50, function(n) object.size(as.matrix(seq_len(n))))
plot(c(0, 50), c(160, max(msizes)), xlab = "Length", ylab = "Bytes",
type = "n")
abline(h = 40 + 160, col = "grey80")
abline(h = 40 + 160 + 128, col = "grey80")
abline(a = 40 + 160, b = 4, col = "grey90", lwd = 4)
lines(msizes, type = "s")
Th: 160, y-ekseni üzerinde, tüm sabitler, sen süreksizlik büyük vektör havuzuna küçük vektör havuzundan atlama tam olarak karşılık görebilir Matrislerle ilişkili değildir (yine de R vektörleridir). Boyutlara bakın <- rep (NA_integer_, 100); (i: 1: 100) boyutlarında [i] <- object.size (rep (1, i)); arsa (boyut) '. – Roland
Karaktere 'm <- matris (' a ', 2, i)' ve tamsayı 'm <- matrisi (1L, 2, i)' ve 'm <- matrisi (DOĞRU, 2, i)' karakterine bakınız. - ya da daha ilginç olanı @Roland'ın önerdiği (karakter, tamsayı ve mantıksal vektörler için). – mnel
@ SimonO101 Hadley sohbette açıkladı. Umarım uygun bir cevap yazma zamanı bulur. E.g., [bu bölüm R-exts] 'ı okuyun (http://cran.r-project.org/doc/manuals/R-exts.html#Profiling-R-code-for-memory-use). – Roland