专栏首页优雅R「R」对象大小——R存储真的会占很大空间吗?

「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。

本文分享自微信公众号 - 优雅R(elegant-r),作者:王诗翔

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 数据科学18 | 统计推断-渐近性

    渐近性(asymptopia)是样本量接近于无穷大时统计行为的一个术语。渐近统计即大样本统计主要研究当样本量n→∞时统计方法的有关渐进性质。渐近性有助于简单的统...

    王诗翔呀
  • 「Workshop」第十七期 奇异值分解

    奇异值分解(Singular Value Decomposition,以下简称SVD)是在机器学习领域广泛应用的算法,它不光可以用于降维算法中的特征分解,还可以...

    王诗翔呀
  • FancyHeatmap,支持输出嵌入网站了!

    FancyHeatmap,是我给TBtools中“卡通式热图”命的名字。前述,在公众号上,我已经推出了这个功能相关的新手教程。在后续,我也发现有不少人已经应用:

    王诗翔呀
  • 基础练习python(6)取自定义数生成一个符合条件的整数集合

    射雕英雄传的题目:判断输入数字是否符合“今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问几何?”

    adventureisoutthere
  • javascript经典面试题之拷贝

    今天和大家一起来探讨一下javascript中的拷贝,使用拷贝的情况,要根据javascript的数据类型来定,javascript的数据类型分为基础类型和引用...

    挥刀北上
  • ARC无效时block的赋值

    forrestlin
  • 了解政治敏感有害信息

    若在QQ上发现政治敏感有害信息,请在客户端直接进行举报。一经发现,腾讯将根据情节进行删除违规信息、警告、限制或禁止使用部分或全部功能直至永久封号的处罚,并有权公...

    用户6966869
  • 李世石再次败北,人工智能势不可挡?

    港湾人儿
  • mysql删除数据空间没有释放

    OPTIMIZE TABLE 当您的库中删除了大量的数据后,您可能会发现数据文件尺寸并没有减小。这是因为删除操作后在数据文件中留下碎片所致。OPTIMIZE T...

    明哥的运维笔记
  • 我的编程之路:知识管理与知识体系

    本文的资料放到了Github Repo(https://github.com/wxyyxc1992/Coder-Knowledge-Graph)(本文介绍的这种...

    程序员宝库

扫码关注云+社区

领取腾讯云代金券