首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >「R」对象大小——R存储真的会占很大空间吗?

「R」对象大小——R存储真的会占很大空间吗?

作者头像
王诗翔呀
发布2020-07-06 17:59:48
7760
发布2020-07-06 17:59:48
举报
文章被收录于专栏:优雅R优雅R

R存储真的会占很大空间吗?本文通过一些简单的示例带你接近真相。

我们利用lobstr::obj_size()函数访问对象的大小。

obj_size(letters)
#> 1,712 B
obj_size(ggplot2::diamonds)
#> 3,456,344 B

在上一篇文章中介绍过列表存储的不是实际的值,而是指向值的引用,所以一个列表的大小比我们预期的可能要小的多。

x <- runif(1e6)
obj_size(x)
#> 8,000,048 B

y <- list(x, x, x)
obj_size(y)
#> 8,000,128 B

这里变量y仅比变量x大80个字节!这正是有3个空值的列表大小:

obj_size(list(NULL, NULL, NULL))
#> 80 B

相似地,R采用全局字符串池,所以字符串向量占用的内存比我们想象中要小的多,重复一个字符串1万次并不会占用相应1万倍的存储空间。

banana <- "bananas bananas bananas"
obj_size(banana)
#> 136 B
obj_size(rep(banana, 100))
#> 928 B

因为引用的使用,估计独立变量占用的内存将比较有挑战性。除非变量x和变量y没有共享元素,obj_size(x) + obj_size(y) = obj_size(x, y)才会成立。

obj_size(x, y)
#> 8,000,128 B

最后,R v3.5.0版本开始引入了ALTREP, short for alternative representation,以:符号指定的序列将不会记录所有的数值,而是记录这个序列,这让它所占用的内存更小了。下面的结果显示无论序列多大啊,占用的内存都是一样的!

obj_size(1:3)
#> 680 B
obj_size(1:1e3)
#> 680 B
obj_size(1:1e6)
#> 680 B
obj_size(1:1e9)
#> 680 B

不止我们在进步,编程语言也在进步喔!

内容整理自Advanced R。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 优雅R 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档