前言
在做單細(xì)胞及其他大數(shù)據(jù)分析時(shí),經(jīng)常保存關(guān)鍵數(shù)據(jù)是很好的習(xí)慣。
但代價(jià)是保存數(shù)據(jù)實(shí)在太慢了,有時(shí)候要等幾分鐘,真的讓人抓狂!
這篇文章介紹一個(gè)R包qs,意為quick save,可大大縮減數(shù)據(jù)的保存和讀取速度。
并且我也做了一些優(yōu)化,編寫成了函數(shù)fast_save和fast_read,讓我們使用更方便。
支持自定義線程數(shù)、同時(shí)保存多個(gè)對(duì)象、自動(dòng)保存對(duì)象名。
文末免費(fèi)領(lǐng)取代碼,趕快試試加快你的分析吧!
速度測(cè)試
函數(shù)寫好了,測(cè)試的活就讓AI來寫吧。
這里我們使用3個(gè)一樣的seurat對(duì)象,每個(gè)對(duì)象包含12萬以上個(gè)細(xì)胞,對(duì)基礎(chǔ)函數(shù)和我編寫的函數(shù)的文件保存速度、文件大小和文件讀取速度進(jìn)行多方面比較。
用到的R包都是CRAN的包,自行安裝吧。
library(qs)
library(parallel)
library(microbenchmark)
準(zhǔn)備數(shù)據(jù)
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
一個(gè)對(duì)象就占用4個(gè)G的內(nèi)存。
定義臨時(shí)文件路徑
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 # 重復(fù)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一開始給我寫了重復(fù)10次我跳,硬控我半小時(shí),想等死我???
普通方法保存需要7~8分鐘,而fast_save只需要23秒,相差20倍!
還是比較震驚的,而我的電腦核數(shù)只有12核,函數(shù)會(huì)使用減1即11核,如果核數(shù)更高設(shè)備寫入速度更快的話,速度還能更高!
比較文件大小
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 # 重復(fù)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
讀取速度快了一倍。
驗(yàn)證讀取結(jié)果一致性(可選)
cat("\n=== 結(jié)果一致性驗(yàn)證 ===\n")
load(rdata_file) # 加載base_save的對(duì)象
qs_objects <- fast_read(qs_file) # 加載fast_save的對(duì)象
# 檢查單個(gè)對(duì)象是否一致
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
保存的內(nèi)容也是完全一致的。
這么好的功能,趕快去試試吧!
同銘公眾浩【生信擺渡】回復(fù)【快速保存】獲取我寫的函數(shù)。
本文由mdnice多平臺(tái)發(fā)布