r语言 - 为什么相同长度的字符串向量具有不同的 object.size?



我期望相同长度的固定长度字符串的向量在 R 中具有相同的对象大小。但是,对于 3 个这样的字符向量,object.size给出不同的结果:

library(stringi)
x <- rep("123456", 100)
y <- c(rep("123456", 50), rep("654321", 50))
set.seed(1)
z <- stri_rand_strings(100, 6)
object.size(x)
#> 888 bytes
object.size(y)
#> 936 bytes
object.size(z)
#> 5640 bytes
object.size(sample(z, 100, replace = T))
#> 4008 bytes
object.size(sample(z, 100, replace = T))
#> 3672 bytes

我的问题是为什么xyz的对象大小不同?

>编辑如果存在全局字符串池,当我们从现有字符串池中采样字符串时,它们应具有相同的大小。但是,情况并非如此,请参阅上述代码的最后两个示例。

在 R 中,字符向量表示为引用单个字符串的一系列pointers

当我们像您一样创建一个字符向量时,x,它被分配了一个长度为 6 的重复字符串(即"123456",例如在您的情况下),R 将只为字符串"123456"分配一次内存,然后为向量的每个元素使用指向该字符串的指针。

这将使x的对象大小相对较小,这仅考虑存储指针所需的内存。

另一方面,在第二种情况下,字符向量y包含两个不同的字符串,分别是"123456""654321",在这里,R 需要分别为这两个字符串中的每一个分配内存,然后为向量的每个元素使用指向这些字符串的指针。

显然,由于这种差异,与x相比,y的对象大小会更大。

在第三种情况下,字符向量z,它将包含 100 个随机生成的字符串,每个字符串的长度为 6。

这些字符串将分别存储在内存中,因此,与xy相比,会产生更大的对象(大小)。

让我知道这是否有帮助...

最新更新