gpt4 book ai didi

r - R 中字符的对象大小 - R 全局字符串池如何工作?

转载 作者:IT王子 更新时间:2023-10-28 23:34:49 27 4
gpt4 key购买 nike

我正在阅读 Hadley 的高级 R 编程,当它讨论字符的内存大小时,它说:

R has a global string pool. This means that each unique string is only stored in one place, and therefore character vectors take up less memory than you might expect.

本书给出的例子是这样的:

library(pryr)
object_size("banana")
#> 96 B
object_size(rep("banana", 10))
#> 216 B

本节的一个练习是比较这两个字符向量:

vec <- lapply(0:50, function(i) c("ba", rep("na", i)))
str <- lapply(vec, paste0, collapse = "")

object_size(vec)
13.4 kB

object_size(str)
8.74 kB

现在,既然文章指出 R 有一个全局字符串池,并且向量 vec 主要由两个字符串(“ba”和“na”)的重复组成,我实际上会 - 直观地- 期望 vec 的大小小于 str 的大小。

所以我的问题是:如何才能最准确地预先估计这些向量的大小?

最佳答案

主要区别在于 vec 中的指针:每个短标量字符串 (CHARSXP) 都必须从相应的字符串向量 (STRSXP) 中指向。 vec 中有大约 1326 个这样的字符串指针,但 str 中只有 51 个(在您的平台上,指针可能是 8 个字节)。该池用于标量字符串(又名 CHARSXP 缓存)。另一个不明显的因素是内部碎片,例如在我的系统上,标量字符串的大小相同,无论它是否有 0 到 7 个字符,8 个字符的字符串只需要更多,依此类推。请参阅以下重复大小:

unlist(sapply(str, object.size))

[1] 96 96 96 104 104 104 104 120 120 120 120 120 120 120 120 136 136 136 136

[20] 136 136 136 136 152 152 152 152 152 152 152 152 216 216 216 216 216 216 216

[39] 216 216 216 216 216 216 216 216 216 216 216 216 216

然而,这些是 R 的内存管理器的实现细节,可能会改变,在用户程序中不应该以任何方式依赖它们 - 使用另一个对象布局/内存管理器,str 可以使用更多空间大于 vec

关于r - R 中字符的对象大小 - R 全局字符串池如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29701721/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com