美文网首页Cook R数据科学与R语言数据-R语言-图表-决策-Linux-Python
【r<-探索】对象大小——R存储真的会占很大空间吗?

【r<-探索】对象大小——R存储真的会占很大空间吗?

作者: 王诗翔 | 来源:发表于2019-01-13 22:38 被阅读7次

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<-探索】对象大小——R存储真的会占很大空间吗?

    R存储真的会占很大空间吗?本文通过一些简单的示例带你接近真相。 我们利用lobstr::obj_size()函数访...

  • 【r<-探索】R对象的名字与值——存储机制图解

    了解R是如何存储数据的将对R的机制、性能的理解亦或是代码的优化都有帮助。 绑定(binding)与 引用(refe...

  • Flutter 疑难杂症(一)

    1、Column中空Text会占一定空间 说明:Column中空Text会占一定空间,会影响布局效果,这空间大小跟...

  • 对象存储系统中的流水模块设计

    开发的对象存储需要统计每天写如的对象个数,所占存储空间大小等数据,一个解决思路是对象上传和删除记录流水,因为对象个...

  • 数据排序

    排序的对象 顺序结构 类似线性表的顺序存储,将文件f=(R1,R2,R3.....Rn)存在一片连续的存储空间,逻...

  • 探索C++对象存储空间

    1)全局对象,全局静态对象何时创建/析构? 全局对象在main函数调用之前被构造 全局对象存储在.data节 (本...

  • java数据存储机制

    堆 特点:堆的特点是存储比较灵活,可以动态的分配存储空间以及大小 存储内容:存储了所有new的对象,以及数组 关于...

  • 指向函数的指针

    理解 函数也会占用一块存储空间因为函数也会占用一块存储空间所以函数也由自己的地址函数的地址保存在函数名中函数名就是...

  • Mac系统硬盘空间详情占用分析

    使用的时间长了,通常我们的系统盘会占用很大的存储空间。 1,打开终端,输入命令 du -sh * 2,进入指定的文...

  • Android之获取storage 手机存储容量

    内部存储空间 我们知道,存储硬件的空间是按着区块来划分的,每个区块有固定的大小。存储设备的总大小=区块大小*区块数...

网友评论

    本文标题:【r<-探索】对象大小——R存储真的会占很大空间吗?

    本文链接:https://www.haomeiwen.com/subject/encrdqtx.html