gpt4 book ai didi

r - 不同大小矩阵的相同内存使用

转载 作者:行者123 更新时间:2023-12-01 05:57:45 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





How to compute the size of the allocated memory for a general type

(1 个回答)


8年前关闭。




当我观察到一些奇怪的事情时,我对 R 中矩阵的内存使用感兴趣。在一个循环中,我增加了矩阵的列数,并计算了每一步的对象大小,如下所示:

x <- 10
size <- matrix(1:x, x, 2)

for (i in 1:x){
m <- matrix(1, 2, i)
size[i,2] <- object.size(m)
}

这使
plot(size[,1], size[,2], xlab="n columns", ylab="memory")

enter image description here

似乎具有 2 行和 5、6、7 或 8 列的矩阵使用完全相同的内存。我们如何解释?

最佳答案

要了解这里发生了什么,您需要了解一些与 R 中对象相关的内存开销。每个对象,即使是没有数据的对象,都有 40 字节的数据与之关联:

x0 <- numeric()
object.size(x0)
# 40 bytes

此内存用于存储对象的类型(由 typeof() 返回)以及内存管理所需的其他元数据。

忽略此开销后,您可能会期望向量的内存使用量与向量的长度成正比。让我们用几个图来检查一下:
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")

Memory usage of vectors

看起来内存使用量与向量的长度大致成正比,但在 168 字节处有很大的不连续性,每隔几步就会有小的不连续性。最大的不连续性是因为 R 有两个向量存储池:由 R 管理的小向量和由操作系统管理的大向量(这是一种性能优化,因为分配大量少量内存很昂贵)。小向量只能是 8、16、32、48、64 或 128 字节长,一旦我们去除 40 字节的开销,这正是我们所看到的:
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

从 64 到 128 的步骤导致了大步,然后一旦我们进入大向量池,向量以 8 字节的块分配(内存以一定大小为单位,R 不能要求半个字节)单元):
# 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

那么这种行为如何与您在矩阵中看到的相对应呢?好吧,首先我们需要看看与矩阵相关的开销:
xv <- numeric()
xm <- matrix(xv)

object.size(xm)
# 200 bytes

object.size(xm) - object.size(xv)
# 160 bytes

因此,与向量相比,矩阵需要额外 160 字节的存储空间。为什么是 160 字节?这是因为矩阵有 dim属性包含两个整数,属性存储在 pairlist 中(旧版本 list() ):
object.size(pairlist(dims = c(1L, 1L)))
# 160 bytes

如果我们使用矩阵而不是向量重新绘制之前的图,并将 y 轴上的所有常数增加 160,您可以看到不连续性正好对应于从小向量池到大向量池的跳跃:
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")

Memory usage of matrices

关于r - 不同大小矩阵的相同内存使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48215604/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com