用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 删除对象数据对象存储大数据测试