
R語言運行在CPU單核單線程上,提高計算效率可以通過并行包:parallel實現(xiàn),該包屬于base包,不需要額外安裝。
parallel::mclapply函數(shù)是 lapply 的并發(fā)版本,可以自定義進程數(shù)發(fā)揮多CPU核心的優(yōu)勢?!癿c”代表“多核”,此函數(shù)將 lapply 任務(wù)分配到多個 CPU 內(nèi)核創(chuàng)建多線程的形式并發(fā)執(zhí)行。線程作為進程的一個執(zhí)行流,是CPU調(diào)度和分派的基本單位,它是比進程更小的能獨立運行的基本單位,線程的優(yōu)勢是提高應(yīng)用程序響應(yīng);使多CPU系統(tǒng)更加有效。操作系統(tǒng)會保證當(dāng)線程數(shù)不大于CPU數(shù)目時,不同的線程運行于不同的CPU上。
step.1創(chuàng)建任務(wù)環(huán)境各種變量
{
library(Seurat);library(dplyr);set.seed(123)
infiles <- dir(path = ".",pattern = "*_raw.rds", full.names = TRUE,recursive = T)
scRNAlist <- lapply(infiles, readRDS) #創(chuàng)建數(shù)據(jù)集list,用于并行運算,本次測試的scRNAlist包含5個數(shù)據(jù)對象
rank_i <- bigmemory::big.matrix(1,1,init = 0) #創(chuàng)建共享內(nèi)存變量,該變量可被所有線程修改,本測試用此變量統(tǒng)計任務(wù)完成順序
m <- synchronicity::boost.mutex() #創(chuàng)建互斥鎖,防止共享內(nèi)存變量被多個線程同時修改引發(fā)異常
}
step.2并行運算任務(wù)基于parallel::mclapply函數(shù),通過mc.cores = 3設(shè)置同時并發(fā)的任務(wù)數(shù)
parallel::mclapply(scRNAlist,function(e) {#并行迭代數(shù)據(jù)集list,每次迭代將數(shù)據(jù)集的元素傳遞給變量 e
print(paste0(Sys.time()," ",unique(e$orig.ident)," processing>>>")) #任務(wù)提交信息
{
suppressWarnings({ #對每個數(shù)據(jù)集進行降維運算
EC <- e %>% NormalizeData(verbose = F) %>% FindVariableFeatures(verbose = F) %>% ScaleData(verbose = F) %>% RunPCA(verbose = F)
})
synchronicity::lock(m) #進程鎖;運行時有且只能有一個運算對共享內(nèi)存變量進行修改,防止進程間同時修改變量引發(fā)異常
rank_i[1] = rank_i[1] + 1 ; #對計序變量進行累加(統(tǒng)計任務(wù)完成的順序)
synchronicity::unlock(m)#解鎖,共享內(nèi)存變量可被修改
}
print(paste0(Sys.time()," ",unique(e$orig.ident)," done!","____________",rank_i[1])) #任務(wù)完成提示信息+任務(wù)完成順序
}, mc.cores = 3,mc.preschedule = FALSE) -> tmp ; rm(tmp)
#從任務(wù)輸出提示信息可以看到,并行循環(huán)開始一次性提交了3個任務(wù)(3并發(fā)),當(dāng)一個任務(wù)完成后,會迅速提交隊列的其它任務(wù)進行運算飽和計算資源。
#最先提交的A-2-work任務(wù)由于數(shù)據(jù)集最小,最先完成,而最先提交的 A-4-work任務(wù)數(shù)據(jù)集較大,是第三個完成的。
[1] "2022-05-19 20:12:26 A-2-work processing>>>"
[1] "2022-05-19 20:12:26 A-3-work processing>>>"
[1] "2022-05-19 20:12:27 A-4-work processing>>>"
[1] "2022-05-19 20:12:29 A-2-work done!____________1"
[1] "2022-05-19 20:12:29 B-1-work processing>>>"
[1] "2022-05-19 20:12:45 B-1-work done!____________2"
[1] "2022-05-19 20:12:46 B-2-work processing>>>"
[1] "2022-05-19 20:13:00 A-4-work done!____________3"
[1] "2022-05-19 20:13:01 B-3-work processing>>>"
[1] "2022-05-19 20:13:04 A-3-work done!____________4"
[1] "2022-05-19 20:13:08 B-2-work done!____________5"
[1] "2022-05-19 20:13:12 B-3-work done!____________6"
當(dāng)只有一個R主進程時的任務(wù)后臺

htop任務(wù)后臺
R主進程提交多任務(wù)并行后創(chuàng)建的3個子線程

htop任務(wù)后臺