用qs替代RData:加速大型单细胞对象存储的终极方案
1. 格式特性对比
2. 性能基准测试
我使用降维聚类分群后的Seurat对象来做测试,细胞数量3000。对比如下:
指标 | RData | rds | qs |
---|---|---|---|
保存时间(秒) | 23.63 | 23.50 | 3.52 |
加载时间(秒) | 3.14 | 3.12 | 1.27 |
文件体积(MB) | 886.41 | 886.41 | 264.05 |
3.RData 格式
Rdata是R语言原生的保存变量的格式,用save保存,load加载,无需赋值,支持保存多个对象。
Rdata的使用:
代码语言:javascript代码运行次数:0运行复制x = 1
y = 2
#保存
save(x,file = 'x.Rdata')
save(x,y,file = 'xandy.Rdata')
#加载
load('x.Rdata')
4.rds格式
Rds也是R语言原生的保存变量的格式,saveRDS保存,readRDS加载,加载时需要赋值,仅支持单个对象。
代码语言:javascript代码运行次数:0运行复制x = 1
#保存
saveRDS(x, file = "x.rds")
#加载
x2 <- readRDS("x.rds")
在单细胞分析过程中存在一个痛点:大的seurat对象保存rdata速度慢,且文件很大。
学员分享给我一个解决方案:qs格式,可以加快大数据保存的速度,节省文件大小,且不影响数据本身的结构,是驾驭大数据的好帮手。
3.qs格式
专为大型对象设计的序列化方案,出自qs包。qsave保存,qread加载。读取时需要赋值,支持保存多个文件
3.1.示例数据
seu.obj.Rdata是seurat降维聚类分群注释后得到的对象.
代码语言:javascript代码运行次数:0运行复制load('seu.obj.Rdata')
library(Seurat)
library(ggplot2)
dim(seu.obj)
代码语言:javascript代码运行次数:0运行复制## [1] 25988 4483
代码语言:javascript代码运行次数:0运行复制UMAPPlot(seu.obj)+
theme_minimal()+
scale_color_brewer(palette = 'Set1')
3.2.qs的使用
代码语言:javascript代码运行次数:0运行复制if(!require(qs))install.packages("qs")
library(qs)
#保存
qsave(seu.obj,'seu.obj.qs')
#保存多个对象
qsavem(x,seu.obj,file = 'xandseu.obj.qs')
#读取
seu.obj2 = qread('seu.obj.qs')
identical(seu.obj,seu.obj2)
代码语言:javascript代码运行次数:0运行复制## [1] TRUE
使用identical判断保存前后的数据是否相同,返回TRUE说明相同。
qs和传统方法最大的差别是保存的速度和文件的大小。
后面都是比较,比较的结果已经放在第二部分啦!
3.3 保存的速度比较
保存Rdata
代码语言:javascript代码运行次数:0运行复制system.time({
save(seu.obj,file = 'seu.obj.Rdata')
})
代码语言:javascript代码运行次数:0运行复制## user system elapsed
## 22.53 0.81 23.63
保存rds
代码语言:javascript代码运行次数:0运行复制system.time({
saveRDS(seu.obj,file = 'seu.obj.rds')
})
代码语言:javascript代码运行次数:0运行复制## user system elapsed
## 22.43 0.94 23.50
保存qs
代码语言:javascript代码运行次数:0运行复制system.time({
qsave(seu.obj,'seu.obj.qs')
})
代码语言:javascript代码运行次数:0运行复制## user system elapsed
## 2.89 0.61 3.52
3.4 加载的速度比较
加载速度差的不多。
加载Rdata
代码语言:javascript代码运行次数:0运行复制system.time({
load('seu.obj.Rdata')
})
代码语言:javascript代码运行次数:0运行复制## user system elapsed
## 2.95 0.18 3.14
加载rds
代码语言:javascript代码运行次数:0运行复制system.time({
seu.obj3 = readRDS('seu.obj.rds')
})
代码语言:javascript代码运行次数:0运行复制## user system elapsed
## 2.94 0.14 3.12
加载qs
代码语言:javascript代码运行次数:0运行复制system.time({
seu.obj <- qread("seu.obj.qs")
})
代码语言:javascript代码运行次数:0运行复制## user system elapsed
## 1.11 0.14 1.27
3.5 文件大小比较
文件大小还是差很远的。
代码语言:javascript代码运行次数:0运行复制file.size('seu.obj.qs')/1024/1024
代码语言:javascript代码运行次数:0运行复制## [1] 264.0488
代码语言:javascript代码运行次数:0运行复制file.size('seu.obj.rds')/1024/1024
代码语言:javascript代码运行次数:0运行复制## [1] 886.4103
代码语言:javascript代码运行次数:0运行复制file.size('seu.obj.Rdata')/1024/1024
代码语言:javascript代码运行次数:0运行复制## [1] 886.4104
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。原始发表:2025-03-11,如有侵权请联系 cloudcommunity@tencent 删除对象数据对象存储大数据测试
发布评论