前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >三种常用的转录组/单细胞数据保存方法(Rdata,rds,qs)

三种常用的转录组/单细胞数据保存方法(Rdata,rds,qs)

原创
作者头像
凑齐六个字吧
发布2024-08-05 10:49:57
1370
发布2024-08-05 10:49:57
举报
文章被收录于专栏:科研工具

目前有三种常用的转录组/单细胞数据保存方法,分别为Rdata,rds和qs。

在分析数据的时候最常规的保存方法是Rdata,这种方法可以把我们想保存的信息全部糅杂在一起变成同一个文件,在下次加载的时候一并加载出来就可以了,是初学者必学的保存数据类型。

但Rdata文件不能很个性化的修改名称,这时候如果不小心出现重名文件就会把上一次的文件给覆盖掉。因此选择rds格式的保存方式可以个性化的进行保存和读取文件,不用担心覆盖的情况,并且保存和读取速度也可能会(实际不一定!)比Rdata会快一些。

但进入单细胞分析时代之后,数据大小动不动就超过了20GB,上述两种方式读取和保存文件的时间变得非常的长,而且一套分析下来有可能占用存储空间会超过200GB。此时使用rdata或者rds格式的保存方式就会出现十分“心累”的情况。

那么在这个大数据分析的时代下,有没有更加适合的数据保存方式呢? 曾老师告诉我可以尝试使用qs的保存方式,这种方式可以在不损坏数据的前提下尽可能的压缩文件,并且同样的文件在保存和读取速度都比上述两种方式更快。

简单总结这三种方式的优缺点。
1. .Rdata

优点:

● 多对象保存:可以在一个 .Rdata 文件中保存多个 R 对象(如数据框、列表、模型等)。

● 兼容性好:这是 R 中最常用的文件格式之一,兼容性高,易于在不同 R 环境中使用。

● 加载灵活:加载 .Rdata 文件时,可以选择性地加载其中的某些对象,而不必加载所有对象。

缺点:

● 文件体积较大:相比其他格式,.Rdata 文件的体积可能较大,特别是当包含多个大型对象时。

● 加载速度慢:加载速度相对较慢,尤其是在保存了大量数据时。

2. .rds

优点:

● 单对象保存:专门用于保存单个 R 对象,更适合需要保存单一数据框或模型的场景。

● 文件体积较小:通常比 .Rdata 文件更小,因为 .rds 文件只保存一个对象,并且通过压缩减少文件大小。

● 加载速度较快:由于文件体积小,加载速度通常比 .Rdata快。

● 灵活性:可以用 readRDS() 加载对象,并赋值给任何变量名称,而不受保存时的对象名称限制。

缺点:

● 仅保存单个对象:只能保存单个对象,不适合需要同时保存多个对象的场景。

● 不包含变量名称:加载 .rds 文件时,必须显式地指定变量名,否则无法直接使用。

3. .qs

优点:

● 超高压缩率:qs 格式使用高效的压缩算法,生成的文件体积非常小,非常适合保存大数据集。

● 读写速度极快:相比于 .Rdata 和 .rds,qs 格式的读写速度显著更快,特别是在处理大数据时表现尤为出色。

● 支持多种压缩等级:可以根据需要调整压缩等级,以平衡文件大小和读写速度。

缺点:

● 兼容性问题:qs 格式相对较新,在一些环境中可能需要额外安装 qs 包,兼容性不如 .Rdata 和 .rds 普遍。

● 社区支持较少:由于qs格式较新,相关的资源和支持可能不如其他格式丰富。

接下来进行代码运行时长和存储文件大小比较,系统中存在这三个文件。

使用system.time()函数去计算代码运行时间,最后会返回三个数值,分别是user,system和elapsed。

● user:用户CPU时间,即R代码本身在用户模式下执行的时间。也就是R解释并运行R代码所花费的时间。

● system:系统CPU时间,即操作系统为代码执行分配的时间。通常是R在操作系统级别处理文件读写或其他系统调用所消耗的时间。

● elspsed:这是墙钟时间(wall clock time),也就是从开始到结束的实际时间,包括了user时间、system时间以及R进程在等待其他资源(如I/O操作)时所花费的时间。换句话说,elspsed时间是在运行代码时实际等待的时间。

1、Rdata格式:
代码语言:javascript
复制
system.time({
save(sce.all,sce,sceList,file = "sce_RAW.Rdata")
})

#   user  system elapsed 
# 22.915  38.786  67.229 

system.time({
load("sce_RAW.Rdata")
})
#   user  system elapsed 
# 21.609  12.622  34.228 

file_info <- file.info("sce_RAW.Rdata")
file_size <- file_info$size
format_file_size <- function(size) {
  if (size < 1024) {
    return(paste(size, "Bytes"))
  } else if (size < 1024^2) {
    return(paste(round(size / 1024, 2), "KB"))
  } else if (size < 1024^3) {
    return(paste(round(size / 1024^2, 2), "MB"))
  } else {
    return(paste(round(size / 1024^3, 2), "GB"))
  }
}

# 使用该函数格式化文件大小
readable_size <- format_file_size(file_size)
print(readable_size)
#[1] "18.86 GB"

保存需要花费1分多钟时间,加载需要花费半分钟左右,最后生成的文件大小为18.86GB。

2、rds格式:

由于只能对单对象保存,这里仅保存最大的文件(sce)

代码语言:javascript
复制
system.time({
saveRDS(sce,file = "sce_RDS.rds")
})
#   user  system elapsed 
#740.750  27.599 770.705 

system.time({
sce <- readRDS("sce_RDS.rds")
})
#   user  system elapsed 
# 92.853  10.411 103.214 

file_info <- file.info("sce_RDS.rds")
file_size <- file_info$size
format_file_size <- function(size) {
  if (size < 1024) {
    return(paste(size, "Bytes"))
  } else if (size < 1024^2) {
    return(paste(round(size / 1024, 2), "KB"))
  } else if (size < 1024^3) {
    return(paste(round(size / 1024^2, 2), "MB"))
  } else {
    return(paste(round(size / 1024^3, 2), "GB"))
  }
}

# 使用该函数格式化文件大小
readable_size <- format_file_size(file_size)
print(readable_size)
# [1] "12.71 GB"

实际情况还是挺慢的,保存时间竟然超过了10分钟..,存储大小变小了一些只有12.71GB(不过只保存了最大的sce)。

3、qs格式:

同样只能对单对象保存,这里仅保存最大的文件(sce)

代码语言:javascript
复制
# 需要先加载一下qs包
library(qs)
system.time({
qsave(sce,file = "sce_qs.qs")
})
#   user  system elapsed 
# 67.516  20.576  88.543  

system.time({
sce <- qread("sce_qs.qs")
})
#   user  system elapsed 
# 20.622  16.275  36.943 

file_info <- file.info("sce_qs.qs")
file_size <- file_info$size
format_file_size <- function(size) {
  if (size < 1024) {
    return(paste(size, "Bytes"))
  } else if (size < 1024^2) {
    return(paste(round(size / 1024, 2), "KB"))
  } else if (size < 1024^3) {
    return(paste(round(size / 1024^2, 2), "MB"))
  } else {
    return(paste(round(size / 1024^3, 2), "GB"))
  }
}

# 使用该函数格式化文件大小
readable_size <- format_file_size(file_size)
print(readable_size)
# [1] "3.58 GB"

保存和加载的时间跟Rdata差不多,存储大小只需要3.58GB,缩小了4.8倍,简直太棒了!

总结:

如果需要保存多个 R 对象,并且不在意文件大小和加载速度,.Rdata 是一种方便的选择

如果只需要保存一个对象,并且希望文件较小,.rds 可能是一个不错的选择。

如果处理的是大数据集,并且对文件体积和加载速度有较高要求,.qs 格式是一个极佳的选择

致谢:感谢曾老师以及生信技能树团队全体成员。

:若对内容有疑惑或者有发现明确错误的朋友,请联系后台(欢迎交流)。更多内容可关注公众号:生信方舟

- END -

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简单总结这三种方式的优缺点。
    • 1. .Rdata
      • 2. .rds
        • 3. .qs
        • 1、Rdata格式:
        • 2、rds格式:
        • 3、qs格式:
        • 总结:
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档