【问题标题】:Why object size are different in R?为什么R中的对象大小不同?
【发布时间】:2020-12-26 17:10:08
【问题描述】:

我在 RStudio 中编写了以下内容,但结果令人惊叹!!!

rm(list = ls())
require(lobstr)
x <- 1:3
tracemem(x)
y <- x
x[1] <- 4L
obj_size(x)
obj_size(y)

为什么它们不同?

【问题讨论】:

标签: r object memory


【解决方案1】:

R 使用特殊的紧凑存储来存储序列。当您更改第一个条目时,它会退回到标准存储。

对于像1:3 这样的短序列,特殊存储实际上低效,但对于1:3000000,大小将相同:

rm(list = ls())
library(lobstr)
x <- 1:3
y <- x
x[1] <- 4L
obj_size(x)
#> 64 B
obj_size(y)
#> 680 B

x <- 1:3000000
y <- x
x[1] <- 4L
obj_size(x)
#> 12,000,048 B
obj_size(y)
#> 680 B

reprex package (v0.3.0) 于 2020 年 12 月 26 日创建

在 R 中定义对象的大小也相当困难。例如,长度为 3(或 300 万)的序列占用 680 字节,但其中两个不占用两倍:

x <- 1:3
obj_size(x)
#> 680 B
y <- 1:3000000
obj_size(y)
#> 680 B
z <- list(x, y)
obj_size(z)
#> 896 B

reprex package (v0.3.0) 于 2020 年 12 月 26 日创建

z 的大小将包含list() 容器以及绑定到xy 的两个对象的大小,但它仍然只比它们各自大216 字节。这是因为xy 的一些大小是共享的:它们都是同一种特殊对象,所以处理它的代码只存储一次。

【讨论】:

    猜你喜欢
    • 2022-01-07
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    相关资源
    最近更新 更多