我期望相同长度的固定长度字符串的向量在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
为什么x
、y
和z
的对象大小不同?
编辑
如果有一个全局字符串池,当我们从现有的字符串池中采样字符串时,它们应该具有相同的大小。然而事实并非如此,请参阅上面代码的最后两个示例。
1条答案
按热度按时间ar7v8xwq1#
在R中,字符向量被表示为引用各个字符串的
pointers
的序列。当我们创建一个字符向量时,就像你做的那样,
x
,它被分配了一个长度为6的重复字符串(即"123456"
,就像你的例子一样),R将只为字符串"123456"
分配一次内存,然后为向量的每个元素使用指向该字符串的指针。这将使
x
的对象大小相对较小,这仅占存储指针所需的内存。另一方面,在第二种情况下,字符向量
y
包含两个不同的字符串,分别是"123456"
和"654321"
,这里,R需要为这两个字符串中的每一个分别分配内存,然后为向量的每个元素使用指向这些字符串的指针。显然,由于这种差异,与
x
相比,y
的对象大小更大。在第三种情况下,字符向量
z
,它将包含100个随机生成的字符串,每个字符串的长度为6。这些字符串将单独存储在内存中,因此,与
x
和y
相比,会产生一个更大的对象(大小)。让我知道如果这有帮助...