更佳阅读体验:R包qs保存文件提速20倍!告别保存和读取R对象巨慢的现象
前言
在做单细胞及其他大数据分析时,经常保存关键数据是很好的习惯。
但代价是保存数据实在太慢了,有时候要等几分钟,真的让人抓狂!
这篇文章介绍一个R包qs
,意为quick save,可大大缩减数据的保存和读取速度。
并且我也做了一些优化,编写成了函数fast_save
和fast_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
保存的内容也是完全一致的。
这么好的功能,赶快去试试吧!
同铭公众浩【生信摆渡】回复【快速保存】获取我写的函数。