R语言 为什么相同长度的字符串的向量有不同的对象大小?

qfe3c7zg  于 2023-04-27  发布在  其他
关注(0)|答案(1)|浏览(135)

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

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的对象大小不同?

编辑

如果有一个全局字符串池,当我们从现有的字符串池中采样字符串时,它们应该具有相同的大小。然而事实并非如此,请参阅上面代码的最后两个示例。

ar7v8xwq

ar7v8xwq1#

在R中,字符向量被表示为引用各个字符串的pointers的序列。
当我们创建一个字符向量时,就像你做的那样,x,它被分配了一个长度为6的重复字符串(即"123456",就像你的例子一样),R将只为字符串"123456"分配一次内存,然后为向量的每个元素使用指向该字符串的指针。
这将使x的对象大小相对较小,这仅占存储指针所需的内存。
另一方面,在第二种情况下,字符向量y包含两个不同的字符串,分别是"123456""654321",这里,R需要为这两个字符串中的每一个分别分配内存,然后为向量的每个元素使用指向这些字符串的指针。
显然,由于这种差异,与x相比,y的对象大小更大。
在第三种情况下,字符向量z,它将包含100个随机生成的字符串,每个字符串的长度为6。
这些字符串将单独存储在内存中,因此,与xy相比,会产生一个更大的对象(大小)。
让我知道如果这有帮助...

相关问题