1. 概述
之前在讀取和處理較大的csv資料時,在嘗試了一次直接讀取處理後發現非常耗時,就改用匯入資料庫,再通過rmysql或者rodbc來讀取處理資料。今天來比較一下。
載入相關packages
library(data.table)
library(dplyr)
library(sqldf)
library(lubridate)
library(rmysql)
2. 讀取資料
2.1 使用data.table
首先通過data.table的 fread() 讀取資料, fread() 比 read.csv() 的效率高很多,這裡不進行詳細比較。
time_fread
test
## 資料的大小
paste("資料的大小為:",format(object.size(test),units="auto"))
資料的大小為: 573.1 mb
2.2 使用rmysql
匯入資料庫後效率最高,雖然匯入資料庫消耗的時間較長,但便於後續統計.
con
# dblisttables(con)
# dbremovetable(con,"test")
# 將資料寫入資料庫
time_mysql_write
dbwritetable(con,"test",test)
通過r匯入資料庫的效率,相對比較耗時,建議通過其他方式匯入。
kable(rbind(time_mysql_write),row.names = f)
user.self
sys.self
elapsed
user.child
sys.child
124.757
2.822
151.031
0.779
0.053
讀取資料庫中的資料表
time_mysql_read
db_test
time_mysql_query
db_test
2.3 讀取資料比較
kable(rbind(time_fread,time_mysql_read))
name
user.self
sys.self
elapsed
user.child
sys.child
time_fread
6.534
0.455
7.265
time_mysql_read
13.185
1.441
25.888
time_mysql_query
6.338
1.298
18.143
很明顯 fread() 的效率最高,所以如果只是讀取資料,還是強烈推薦 fread() 。針對讀取資料庫表全部資料, dbreadtable() 比 dbgetquery() 讀取資料的效率還差。
3. 處理資料
分別通過 data.table、dplyr、sqldf、rmysql 這四種方式來統計相關資料。
3.1 使用data.table
time_dt
test_month1
3.2 使用dplyr
time_dplyr
test_month2 %
group_by(year=year(日期),month=month(日期)) %>%
summarise(value=sum(資料)) %>%
ungroup()
3.3 使用sqldf
## 需要先解除安裝rmysql
detach("package:rmysql", unload=true)
time_sqldf_s
test$日期
test_month3
strftime('%m',日期) as month,sum(資料) as test_amount from test group by strftime('%y', 日期 * 3600 * 24, 'unixepoch'),
strftime('%m',日期)")
time_sqldf
3.4 使用rmysql
library(rmysql)
con
test_month_sql
sum(資料) as test_amount from test group by year(日期),month(日期)"
time_mysql
test_month4
3.5 處理資料比較
rbind(time_dt,time_dplyr,time_sqldf,time_mysql)
name
user.self
sys.self
elapsed
user.child
sys.child
time_dt
7.846
1.112
9.063
time_dplyr
8.155
1.182
9.487
time_sqldf
37.343
2.650
40.868
time_mysql
0.001
0.000
2.449
通過資料庫來處理資料效率最高,其次為 data.table 和 dplyr ,二者不相伯仲,data.table語法更加優雅易讀,dplyr語法更加簡潔,看自己的喜好啦。而 sqldf 的效率最差,不推薦。
4. 總結
推薦使用data.table的 fread() 讀取資料,再匯入資料庫(通過r匯入資料庫比較耗時,推薦用其他方式匯入),再通重載入資料庫包通過 dbgetquery() 讀取資料。 dbreadtable() 讀取全部資料,效率較差,不推薦。
python中的CSV大資料讀取
主要有兩種方式 1.pd.read csv file,chunksize chunk size 這樣可以保證分塊讀取 下面的部落格提供了如下的 2.dask包 import dask.dataframe as dd dd.read csv dask包採用的是並行讀取,速度會快很多。在個人筆記本上測試...
Pytorch 讀取大資料集
記錄一下pytorch讀取大型資料集的要點 pytorch 讀取大資料集的一般方法 class mydataset data.dataset def init self,root filepath self.root root init 中讀取檔案路徑而非檔案本體 self.imgs list se...
Python 讀取資料
將乙個資料夾下面的影象和對應的pts讀進來,然後把pts檔案裡面的資料讀入乙個陣列,然後畫到影象上 coding utf 8 測試資料樣例 讀取 image cv2.imread fullpath 讀取對應的pts檔案 landmarks readlmk ptsfile for point in l...