R包qs保存文件提速20倍!告别保存和读取R对象巨慢的现象

更佳阅读体验:R包qs保存文件提速20倍!告别保存和读取R对象巨慢的现象

前言

在做单细胞及其他大数据分析时,经常保存关键数据是很好的习惯。

但代价是保存数据实在太慢了,有时候要等几分钟,真的让人抓狂!

这篇文章介绍一个R包qs,意为quick save,可大大缩减数据的保存和读取速度。

并且我也做了一些优化,编写成了函数fast_savefast_read,让我们使用更方便。

支持自定义线程数、同时保存多个对象、自动保存对象名。

文末免费领取代码,赶快试试加快你的分析吧!


速度测试

函数写好了,测试的活就让AI来写吧。

这里我们使用3个一样的seurat对象,每个对象包含12万以上个细胞,对基础函数和我编写的函数的文件保存速度文件大小文件读取速度进行多方面比较。

用到的R包都是CRAN的包,自行安装吧。

library(qs)
library(parallel)
library(microbenchmark)

准备数据

obj
# An object of class Seurat 
# 33538 features across 122373 samples within 1 assay 
# Active assay: RNA (33538 features, 0 variable features)
obj2 = obj3 = obj
format_size(as.numeric(object.size(obj)))
# 3.82 GB

一个对象就占用4个G的内存。

定义临时文件路径

rdata_file <- "test_objects.RData"
qs_file <- "test_objects.qs"

比较保存速度

cat("=== 保存速度比较 ===\n")
save_bench <- microbenchmark(
    "base_save" = save(obj, obj2, obj3, file = rdata_file),
    "fast_save" = fast_save(obj, obj2, obj3, file = qs_file),
    times = 3  # 重复3次取平均
)
print(save_bench)
# === 保存速度比较 ===
# Unit: seconds
#       expr       min        lq      mean    median        uq       max neval
#  base_save 456.50256 462.15330 464.68392 467.80405 468.77461 469.74517     3
#  fast_save  21.24375  21.40916  21.83748  21.57456  22.13434  22.69412     3

AI一开始给我写了重复10次我跳,硬控我半小时,想等死我!?

普通方法保存需要7~8分钟,而fast_save只需要23秒,相差20倍!

还是比较震惊的,而我的电脑核数只有12核,函数会使用减1即11核,如果核数更高设备写入速度更快的话,速度还能更高!

比较文件大小

cat("\n=== 文件大小比较 ===\n")
file_sizes <- data.frame(
    方法 = c("base_save (.RData)", "fast_save (.qs)"),
    大小_KB = c(
        file.size(rdata_file) / 1024,
        file.size(qs_file) / 1024
    )
)
print(file_sizes)
# === 文件大小比较 ===
#                 方法 大小_KB
# 1 base_save (.RData) 2.23 GB
# 2    fast_save (.qs) 1.56 GB

文件大小也小了1/3。

比较读取速度

cat("\n=== 读取速度比较 ===\n")
read_bench <- microbenchmark(
    "base_load" = { load(rdata_file) },
    "fast_read" = { qs_objects <- fast_read(qs_file) },
    times = 10  # 重复10次取平均
)
print(read_bench)
# === 读取速度比较 ===
# Unit: seconds
#       expr      min       lq     mean   median       uq      max neval cld
#  base_load 41.68289 41.76349 43.67275 41.84408 44.66767 47.49127     3  a 
#  fast_read 16.18580 19.82309 23.25227 23.46037 26.78551 30.11064     3   b

读取速度快了一倍。

验证读取结果一致性(可选)

cat("\n=== 结果一致性验证 ===\n")
load(rdata_file)  # 加载base_save的对象
qs_objects <- fast_read(qs_file)  # 加载fast_save的对象

# 检查单个对象是否一致
cat("obj一致性:", identical(obj, qs_objects$obj), "\n")
cat("obj2一致性:", identical(obj2, qs_objects$obj2), "\n")
cat("obj3一致性:", identical(obj3, qs_objects$obj3), "\n")
# obj一致性: TRUE 
# obj2一致性: TRUE 
# obj3一致性: TRUE

保存的内容也是完全一致的。

这么好的功能,赶快去试试吧!


同铭公众浩【生信摆渡】回复【快速保存】获取我写的函数。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值