bind merge r 和join_R语言并行读取csv:地表最快csv合并方法
作者:黃天元,復旦大學博士在讀,熱愛數據科學與開源工具(R),致力于利用數據科學迅速積累行業經驗優勢和科學知識發現,涉獵內容包括但不限于信息計量、機器學習、數據可視化、應用統計建模、知識圖譜等,著有《R語言數據高效處理指南》(《R語言數據高效處理指南》(黃天元)【摘要 書評 試讀】- 京東圖書,《R語言數據高效處理指南》(黃天元)【簡介_書評_在線閱讀】 - 當當圖書)。知乎專欄:R語言數據挖掘。郵箱:huang.tian-yuan@qq.com.歡迎合作交流。
以前有多個csv要合并成一個(文件所有的列一般都是一致的),把文件路徑設置到那里,然后寫一個循環一個一個讀,然后每個循環后面就使用rbind/bind_rows合在一起。比如:
library(tidyverse)# 假設已經在csv文件所在路徑dir() %>% str_subset(".csv$") -> fn all = tibble() for(i in fn){read_csv(i) %>%bind_rows(all) -> all }為了充分利用計算機的所有性能,讓讀取更加迅速,我在多次試錯下,終于寫下這么一段代碼:
library(pacman) p_load(doParallel,data.table,dplyr,stringr,fst)# 識別所在文件路徑下所有的csv文件名稱 dir() %>% str_subset(".csv$") -> fn# 并行計算環境設置 (cl = detectCores() %>% makeCluster()) %>% registerDoParallel()# 并行讀取csv,并進行合并 system.time({big_df = foreach(i = fn,.packages = "data.table") %dopar% {fread(i,colClasses = "character")} %>% rbindlist(fill = T) })# 停止并行環境 stopCluster(cl)# 讀出文件 write_fst(big_df,"big_df.fst",compress = 100)# fwrite(big_df,"bid_df.csv")這是我目前探索出來能夠最快速度合并任意文件夾任意數量csv的代碼,沒有之一。計算機的核越多,效果越明顯。fread的快速在當前是無可匹敵的,而colClasses參數的設置,讓讀取不需要進行過多的數據類型判斷,這樣在最后合并的時候也就不會報錯。rbindlist是data.table中專門用來合并列表中data.table的函數,fill設置為TRUE可以提高容錯性(如果多個數據表中列名稱不同,會填充NA值)。最后,合并成一個巨大的數據框,存在big_df中,建議使用fst包來讀出,compress開到盡頭設置為100,可以實現最大的壓縮和快速讀寫,空間時間雙節省(如果一定需要csv格式的話,也可以用fwrite讀出)。我想這樣的數據表可能永遠也不會需要完全讀入,fst支持部分讀取功能(讀取部分行或列),因此fst這個格式是非常合適的。
2020/04/29更新:新的方案
if (!require("pacman")) install.packages("pacman") pacman::p_load(future.apply, data.table, stringr)# get the file name dir() %>% str_subset(".csv$") -> fnplan(multiprocess)future_lapply(fn,fread,colClasses = "character") %>% rbindlist(fill = TRUE) -> resres就是我們要的合并后的數據框。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的bind merge r 和join_R语言并行读取csv:地表最快csv合并方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 类方法 函数_Python
- 下一篇: linux更改nginx最大访问数,Li