了解object.size()与nchar()

时间:2014-08-19 23:14:50

标签: r

考虑以下向量xy

x <- "a"
y <- deparse(x)

来自?nchar

  

nchar将一个字符向量作为参数,并返回一个向量,其元素包含x的相应元素的大小。

来自?object.size

  

计算的是对象的大小,并且不包括在符号表中存储其名称所需的空间。

根据这两个定义,内存中y的对象大小是否应该大于x的对象大小?

> nchar(x) == nchar(y)
[1] FALSE
> object.size(x) == object.size(y)
[1] TRUE

机器信息:

> version[[1]]
# [1] "x86_64-pc-linux-gnu"

1 个答案:

答案 0 :(得分:3)

不一定。您通常不会为字符串留出所需的精确内存量,因为它很难跳过并在内存中找到您需要的内存,因此分配将以块的形式进行。观察

rv<-1:100
os<-sapply(rv, function(x) object.size(paste0(rep("a",x), collapse="")))
plot(rv,os, xlab="string length", ylab="object size")

enter image description here

在这里,我们创建字符串&#34; a&#34;,&#34; aa&#34;,&#34; aaa&#34;,&#34; aaaa&#34;等,并查看对象大小。请注意,对象的大小不会随着每个附加字符而增加,但是当您通过阈值时,会获得更大的块分配给您。

因此,对象大小并不能告诉您数据实际占用的字节数,它只是告诉您已经预留了多少字节。实际上并没有相同的东西。