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

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

作者头像
王诗翔呀
发布于 2020-07-06 09:59:48
发布于 2020-07-06 09:59:48
91400
代码可运行
举报
文章被收录于专栏:优雅R优雅R
运行总次数:0
代码可运行

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
obj_size(letters)
#> 1,712 B
obj_size(ggplot2::diamonds)
#> 3,456,344 B

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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个空值的列表大小:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
obj_size(list(NULL, NULL, NULL))
#> 80 B

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)才会成立。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
obj_size(x, y)
#> 8,000,128 B

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
3297: [USACO2011 Open]forgot
3297: [USACO2011 Open]forgot Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 69  Solved: 51 [Submit][Status][Discuss] Description    发生了这么多,贝茜已经忘记了她cowtube密码。然而,她记得一些有用的信息。  首先,她记得她的密码(记为变量P)长度为L(1 <= L<=1,000)字符串,并可以被分成  一个或多个词(不一定是唯一的),词来自于字典中NW(1<=NW<=
HansBug
2018/04/11
5930
127-R编程21-R节约内存的内部机制和垃圾回收
之前提了[[124-R编程18-R的内部机制2]],通过复制修改机制,R 非常聪明在合适的时机建立副本,节省了不必要的内存开支。
北野茶缸子
2022/05/19
7650
127-R编程21-R节约内存的内部机制和垃圾回收
02 . Python之数据类型
变量存储在内存中的值。这就意味着在创建变量时会在内存中开辟一个空间。基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中。 因此,变量可以指定不同的数据类型,这些变量可以存储整数,小数或字符.
iginkgo18
2020/09/27
1.8K0
02 . Python之数据类型
8个超好用的Python内置函数,提升效率必备!
python中有许多内置函数,不像print那么广为人知,但它们却异常的强大,用好了可以大大提高代码效率。
bugsuse
2020/04/21
7940
8个超好用的Python内置函数,提升效率必备!
【Python篇】快速理解Python语法:全面指南
Python作为一种高级编程语言,因其简单易学、功能强大而受到广泛欢迎。本文将对Python的核心语法进行详细讲解,帮助你更好地理解和掌握Python编程。如果你已经具备了C语言的基础,本篇博客将帮助你快速上手Python并深入理解其独特的语法特性。
半截诗
2024/10/09
3940
python3入门与进阶(二)
如果字符串可以改变,那么可以使用索引值给字符串赋值"python"[0] = 'h' -----> 报错,会发现报错,是不行的。
py3study
2020/01/02
4800
AK47所向披靡,内存泄漏一网打尽
青囊,喜欢运动T恤加皮裤的非典型程序猿。此时,他正目不转睛注视着屏幕上一行行的代码,内存泄漏这个问题已经让他茶饭不思两三天了,任凭偌大的雨滴捶打着窗户也无动于衷。就这么静悄悄地过了一会儿,突然间,他哼着熟悉的小曲,仿佛一切来的又那么轻松又惬意。
233333
2021/06/10
7540
AK47所向披靡,内存泄漏一网打尽
JVM-内存结构篇笔记
PCR是一个较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器(==不会存在内存溢出==)。
Karos
2023/02/16
1.1K1
JVM-内存结构篇笔记
Python数据分析常用30段优化代码
以下方法可以检查给定列表是不是存在重复元素,它会使用 set() 函数来移除所有重复元素。
天道Vax的时间宝藏
2022/05/11
4100
R语言之内存管理
在处理大型数据过程中,R语言的内存管理就显得十分重要,以下介绍几种常用的处理方法。 1,设置软件的内存
悟乙己
2019/05/28
2.1K0
速读原著-HotSpot虚拟机对象探秘
Java 是一门面向对象的编程语言,Java 程序运行过程中每时每刻都有对象被创建出来。在语言 层面上,创建对象通常(例外:克隆、反序列化)仅仅是一个 new 关键字而已,而在虚拟机中, 对象(本文中讨论的对象限于普通 Java 对象,不包括数组和 Class 对象等)的创建又是怎样一个过程呢? 虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过的。如果没有,那必须先执行相应的类加载过程。
cwl_java
2020/02/14
4360
用R和Keras深度学习的例子
本文研究了使用R语言进行深度学习在图像分类问题上的应用,并对比了使用不同框架和不同训练方式对模型性能的影响。结果表明,虽然R语言本身无法直接进行深度学习,但使用TensorFlow和Keras等框架和库,可以有效地进行深度学习图像分类。同时,使用预训练模型和数据增强技术可以进一步提高模型性能。
花落花飞去
2017/12/20
4.4K0
「R」操作数据库
关系型数据库就是一个由表和表之间的关系组成的集合。数据库中的表和R中的数据框有相同地形式。表之间可以互相关联,让我们能够轻松合并多张表信息。
王诗翔呀
2022/01/21
1.4K0
「R」操作数据库
Java 编程问题:二、对象、不变性和`switch`表达式
本章包括 18 个涉及对象、不变性和switch表达式的问题。本章从处理null引用的几个问题入手。它继续处理有关检查索引、equals()和hashCode()以及不变性(例如,编写不可变类和从不可变类传递/返回可变对象)的问题。本章的最后一部分讨论了克隆对象和 JDK12switch表达式。本章结束时,您将掌握对象和不变性的基本知识。此外,你将知道如何处理新的switch表达式。在任何 Java 开发人员的武库中,这些都是有价值的、非可选的知识。
ApacheCN_飞龙
2022/07/11
1.4K0
python 数据模型
https://github.com/ccc013/CodesNotes/blob/master/FluentPython/1_Python%E6%95%B0%E6%8D%AE%E6%A8%A1%E5%9E%8B.ipynb
kbsc13
2020/04/22
1.1K0
python 数据模型
ES6 完全使用手册
在我们开发的时候,可能认为应该默认使用 let 而不是 var,这种情况下,对于需要写保护的变量要使用 const。
夜尽天明
2019/07/17
1.5K0
【R的极客理想系列文章】RHadoop培训 之 R基础课
R是一种语法非常简单的表达式语言(expression language),大小写敏感。 可以在R 环境下使用的命名字符集依赖于R 所运行的系统和国家(系统的locale 设置),允许数字,字母,“.”,“_”
Ai学习的老章
2019/04/10
3.1K0
【R的极客理想系列文章】RHadoop培训 之 R基础课
「R」对象的名字与值——存储机制图解
将c(1, 2, 3)赋值给变量x时,实际上是将数值向量绑定到x上的过程,变量x称为引用。
王诗翔呀
2020/07/06
7810
「R」对象的名字与值——存储机制图解
0/1To Begin/数据类型与结构
0 To Begin//:向下取整除法**:乘方在交互模式下,上一次打印出来的表达式被赋值给变量 _如果不希望前置了 \ 的字符转义成特殊字符,可以使用 原始字符串 方式,在引号前添加 r 即可python可以多重赋值,如:a,b=b,a+b1 数据类型与结构1.1 数字1.2 序列-字符串 字符串可以用 + 进行连接(粘到一起),也可以用 * 进行重复 相邻的两个或多个 字符串字面值 (引号引起来的字符)将会自动连接到一起 连接变量和字面值,需要使用+号,不能省略 字符串与列表是可以被 索引 (下标访问
狼啸风云
2019/11/07
1.1K0
Redis入坟(一)redis的前世今生、redis基础及存储结构源码讲解
08 年的时候有一个意大利西西里岛的小伙子,笔名 antirez,创建了一个访客信息网站 LLOOGG.COM。有的时候我们需要知道网站的访问情况,比如访客的 IP、操作系统、浏览器、使用的搜索关键词、所在地区、访问的网页地址等等。在国内,有很多网站提供了这个功能,比如 CNZZ,百度统计,国外也有谷歌的 Google Analytics。我们不用自己写代码去实现这个功能,只需要在全局的 footer 里面嵌入一段JS 代码就行了,当页面被访问的时候,就会自动把访客的信息发送到这些网站统计的服务器,然后我们登录后台就可以查看数据了。
源码之路
2020/09/04
1.2K0
Redis入坟(一)redis的前世今生、redis基础及存储结构源码讲解
相关推荐
3297: [USACO2011 Open]forgot
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档