最近、Shinyでアプリケーションを作成しました。このアプリケーションでは、非常に大きなデータブロック(データフレーム)を使用する必要がありました。 これはアプリケーションの起動時間に直接影響したため、Rのファイル(この場合、これらは顧客から提供されたcsvファイル)からデータを読み取り、最適なものを決定するいくつかの方法を検討する必要がありました。
この投稿の目的は以下を比較することです:
utils
read.csv
は、RでCSVファイルを読み取る標準的な方法です。read_csv
readr
で以前のメソッドを置き換えましたreadRDS
からのload
とreadRDS
read_feather
fread
。
データ
まず、いくつかのランダムデータを生成します。
set.seed(123) df <- data.frame(replicate(10, sample(0:2000, 15 * 10^5, rep = TRUE)), replicate(10, stringi::stri_rand_strings(1000, 5)))
ファイルをディスクに保存して、ダウンロード時間を推定します。
csv
形式に加えて、
feather
、
RDS
および
Rdata
も必要
Rdata
。
path_csv <- '../assets/data/fast_load/df.csv' path_feather <- '../assets/data/fast_load/df.feather' path_rdata <- '../assets/data/fast_load/df.RData' path_rds <- '../assets/data/fast_load/df.rds' library(feather) library(data.table) write.csv(df, file = path_csv, row.names = F) write_feather(df, path_feather) save(df, file = path_rdata) saveRDS(df, path_rds)
次に、ファイルサイズを確認します。
files <- c('../assets/data/fast_load/df.csv', '../assets/data/fast_load/df.feather', '../assets/data/fast_load/df.RData', '../assets/data/fast_load/df.rds') info <- file.info(files) info$size_mb <- info$size/(1024 * 1024) print(subset(info, select=c("size_mb")))
ご覧のとおり、両方のファイル形式、
csv
、および
feather
、より多くのディスク容量を占有します。
Csv
-6倍、
feather
-
RDS
および
RData
4倍以上。
性能試験
10ラウンドの読み取り時間を比較するために、
microbenchmark
ライブラリが
microbenchmark
。 方法
- utils :: read.csv
- リーダー:: read_csv
- data.table :: fread
- ベース::ロード
- ベース:: readRDS
- フェザー:: read_feather
library(microbenchmark) benchmark <- microbenchmark(readCSV = utils::read.csv(path_csv), readrCSV = readr::read_csv(path_csv, progress = F), fread = data.table::fread(path_csv, showProgress = F), loadRdata = base::load(path_rdata), readRds = base::readRDS(path_rds), readFeather = feather::read_feather(path_feather), times = 10) print(benchmark, signif = 2) ##Unit: seconds ## expr min lq mean median uq max neval ## readCSV 200.0 200.0 211.187125 210.0 220.0 240.0 10 ## readrCSV 27.0 28.0 29.770890 29.0 32.0 33.0 10 ## fread 15.0 16.0 17.250016 17.0 17.0 22.0 10 ## loadRdata 4.4 4.7 5.018918 4.8 5.5 5.9 10 ## readRds 4.6 4.7 5.053674 5.1 5.3 5.6 10 ## readFeather 1.5 1.8 2.988021 3.4 3.6 4.1 10
そして
勝者は …
feather
です! ただし、
feather
を使用するには、ファイルをこの形式に予備変換する必要があります。
load
または
readRDS
を使用すると、パフォーマンス(速度の点で2位と3位)を改善できます。小さな/圧縮ファイルを保存することも利点です。 どちらの場合も、最初にファイルを適切な形式に変換する必要があります。
csv
形式からの読み取りに関しては、
fread
は
read_csv
および
read.csv
よりも大幅に優れているため、
csv
ファイルからの読み取りに最適なオプションです。
この場合、
csv
からこの形式への変換は使い捨てであり、ファイルサイズに厳密な制限はなかったため、
feather
ファイルを使用することにし
RData
。したがって、
RData
または
RData
は考慮しませんでした。
アクションの最終シーケンスは次のとおりです。
fread
を使用して顧客から提供されたcsv
ファイルを読み取り、write_feather
を介してこのファイルをfeather
書き込みます。read_feather
を使用して、アプリケーションの起動時にfeather
ファイルをロードします。
最初の2つのタスクは、一度実行され、Shinyアプリケーションのコンテキスト外で実行されました。
Rでファイルを読み取るための別の
興味深いパフォーマンステストがあります。残念なことに、記事で指定された関数を使用すると、文字列型のオブジェクトを取得し、最も広く頻繁に使用される文字列データを処理する前に文字列データの処理を実行する必要があります
データフレーム