R包qs保存文件提速20倍!告別保存和讀取R對(duì)象巨慢的現(xiàn)象

前言

在做單細(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_savefast_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ā)布

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容