R語音中的並行與分段技巧

在衆多編程語言中,R語言是典型的運行慢和耗內存。當數據表比較龐大(比如一個數據集達100G),而內存有限時(比如一臺普通電腦內存16G),使用R語言一次讀入和處理,常規做法完全不可行。即使調大虛擬內存(swap空間),使用memory.limit(Windows系統)或 ulimit -s -v(Linux系統)等操作(虛擬內存其實很慢),即使再輔之以rm()和gc()及時清理內存(個人感覺效果甚微),也會讓電腦運行陷入無止盡的卡頓中。當硬件設備有限時,我們可以使用並行運算和分段技巧應對這種情形。

R語言中一般使用parallel包完成並行運算,具體寫法此處不贅述,請自行查閱相關資料。建議使用Linux或Mac執行並行運算,因爲可以使用FORK模式共享主程序的變量從而節約內存。並行運算不僅可以解決運行速度慢的問題,還可以用於及時回收內存,效果明顯優於rm和gc(R語言的內存管理特點請參考相關資料,值得注意的是,同名變量有可能出現多份拷貝)。當我們估計某一段代碼會產生較多的臨時變量時,可以將這段代碼放入並行運算中(新開一個集羣cluster),運行完後關閉cluster即可回收所有內存。如果某段代碼完整運行完需要大量內存,擔心內存不夠用時,可以再將代碼分段(每運行完一段就回收一次cluster),比如按col將數據表分成100份,原本需要60G內存的操作,可優化到僅需6G。簡言之,並行結合分段,可以將CPU和內存的使用優化到非常舒服的狀態。

另外,將中間結果保存到硬盤,也是一種節約時間和內存的技巧。一方面,當需要重新調用程序,則可以直接“讀檔”(中間結果)來節約時間;另一方面,由於產生中間結果時,已經消耗了較多內存而又無法很好得回收內存時,重啓R再讀檔中間結果,則可回收大量內存。注意,當中間結果較大時,應該分段保存(比如將8G的數據表分成16份)。讀取時,若內存夠用,則可使用多個CPU同時讀取再合併;若擔心讀取時內存不夠用,再使用分段的技巧讀取。由於讀取再合併結果後,實際上總共會有2份數據,若擔心rm和gc回收效果不佳,則可將讀取和合並的操作放入新的cluster中,合併後關掉cluster即可。

簡單的“存檔”和“讀檔”代碼示例如下

library(dplyr)
library(parallel)

# Save data_Methy
cl <- makeCluster(1, type="FORK")
out<-parLapply(cl,1,function(j){
  temp<-list()
  for (i in 1:8){
    start<-(i-1)*36+2
    end<-i*36+1
    batch_col<-c(1,c(start:end))
    temp[[i]]<-data_methy_m %>% select(c(1,batch_col))
  }
  return(temp)
})[[1]]
stopCluster(cl)

x<-1:8
cl <- makeCluster(8, type="FORK")
parLapply(cl,x,function(i){
  write.table(out[[i]],file=paste("Methylation/Methy_beta_",as.character(i),".tsv",sep=""),row.names = F,sep="\t")
  return(0)
})[[1]]
stopCluster(cl)

# Load data_Methy
cl <- makeCluster(1, type="FORK")
data_methy_m<-parLapply(cl,1,function(j){
  for (k in 1:8){
    cl_2 <- makeCluster(1, type="FORK")
    results<-parLapply(cl_2,k,function(i){
      temp<-read.table(paste("Methylation/Methy_beta_",as.character(i),".tsv",sep=""),sep="\t",header=T) %>% as_tibble()
      if (i>1){
        temp<-inner_join(results,temp,by="Composite.Element.REF")
      }
      return(temp)
    })[[1]]
    stopCluster(cl_2)
  }
  return(results)
})[[1]]
stopCluster(cl)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章