R语言各数据类型内存占用查询 最小存储类型及整数与字符存储对比
R语言内置数据类型内存占用实测与选型参考
各类内置数据类型的内存开销基线
基于64位操作系统环境下的通用实测结果,R中基础数据类型不存在“裸存”机制,每个R对象都会附带固定的SEXP元数据头部开销,各类型的存储开销为:
- raw(原始型):单元素场景下总开销为48字节,向量长度为N时,每新增1个元素额外占用1字节,是长向量场景下内存效率最高的基础类型
- integer(整型):单元素场景下总开销为48字节,向量长度为N时,每新增1个元素额外占用4字节
- logical(逻辑型):单元素场景下总开销为48字节,向量长度为N时,每新增1个元素额外占用4字节
- numeric(双精度数值型):单元素场景下总开销为56字节,向量长度为N时,每新增1个元素额外占用8字节
- complex(复数型):单元素场景下总开销为64字节,向量长度为N时,每新增1个元素额外占用16字节
- character(字符型):单元素场景下总开销为112字节,向量长度为N时,每新增1个元素额外占用8字节,字符串内容本身的长度会按每字节1单位追加开销
以上统计采用pryr::object_size()方法,相比基础包的object.size()会准确计算共享引用的实际内存占用,无统计偏差。
单元素存储场景:整数 vs 字符的实际占用差异
可直接运行以下代码复现实测结果:
library(pryr) # 显式声明单元素整数(R中不带L的默认1为双精度类型,不属于整型) single_integer <- 1L # 显式声明单字符 single_char <- "a" # 输出实际内存占用 object_size(single_integer) # 48 B object_size(single_char) # 112 B
两者的开销差异非常明确:
存储单个整数
1L的总内存开销为48字节,存储单个字符"a"的总内存开销为112字节,字符存储的单元素开销是整数的2.3倍。
这种差异的核心原因来自R的字符实现机制:R中的字符值并非直接存储字符本身,而是一个指向全局字符串池的指针,加上字符串对象本身的元数据头部,整体开销远大于直接二进制存储的整数类型。
面向最低内存目标的选型指南
- 同业务逻辑下优先选择内存效率更高的类型,长向量场景下的内存效率排序为:
raw > integer > logical > numeric > complex > character,能不用字符型就不用,从根源压缩存储规模 - 大规模存储时可优先将重复取值的字符型列转换为
factor(因子型),转换后底层存储为整数索引,单元素开销从112字节降到4字节级别,是宽表压缩的通用手段 - 避坑提示:日常写代码时不带
L后缀的数值默认是双精度类型,单元素就占56字节,比显式声明的整型多8字节开销,全列都是整数取值的数据集,批量转成integer类型可直接砍掉近一半的数值列内存 - 不存在“标量比向量省内存”的优化效果:R中长度为1的标量和同类型长度为1的向量内存开销差不到1字节,无需为了省内存刻意拆分存储颗粒度
内容的提问来源于stack exchange,提问作者Jantje Houten
相关产品推荐
相关产品推荐

